我有一个自定义类数组[CustomClass]
。我正在尝试将其转换为[AnyObject]
.
self.customClassArray = self.anyObjectArray as [AnyObject]
我收到以下错误:
“AnyObject”不是“CustomClass”的子类型
和
无法将类型“[CustomClass]”的值强制转换为类型“[AnyObject]”。
我错过了什么?
基本上没有你必须将你的CustomClass
转换为AnyObject
.
您的自定义类是的子类型,AnyObject
而不是相反,因此任何需要 an 的函数AnyObject
都可以处理您的CustomClass
1.) 您可以将超类对象转换为子类类型。
2.) 您不能将子类类型的对象转换为超类。
这是继承的一般规则。
同样的规则也适用于协议采用。
例如,假设您有三个班级。A、B、C 类。
Class A {
}
B类是A的子类。
Class B : A {
}
C类是A的子类。
Class C : A {
}
换句话说,您可以说 A 是 B 类和 c 类的超类。
你有如下对象。
var objA = A()
var objB = B()
var objC = C()
在这种情况下,您可以将 objA 转换为 B 类或 C 类的类型。即
let objB1 = objA as! B //success
let objC1 = objA as! C //success
但是您不能手动将 objB 或 objC 转换为 A 类的类型。即
let objA1 : A = objB as! A //will not allowed
您可以将 B 类或 C 类的对象存储为 A 类的类型,而无需强制转换。IE
let objA2 : A = objB; // objB is type of class B.
let objA3 : A = objC; // objC is type of class C.
然后稍后您可以在需要时将 objA2 强制转换为 B 类的类型,例如
let objB3 = objA2 as! B
AnyObject 是 Swift 中的一个协议。
所有类都隐式遵守的协议。
@objc protocol AnyObject
你不需要手动实现这个协议,它是隐式的。
A、B、C类也采用AnyObject协议,
因此您可以将 A、B 或 C 的对象存储为 AnyObject 类型。
就像我们上面的语句:: let objA2 : A = objB; // objB 是 B 类的类型。
let anyObj1 : AnyObject = objA
let anyObj2 : AnyObject = objB
let anyObj3 : AnyObject = objC
您不能手动转换为 AnyObject 类型。你可以像上面一样直接存储。
然后稍后您可以转换,
anyObj1 类型 A
anyObj2 类型 B
anyObj3 输入 C
class C {
var i: Int = 0
func foo() { print(i) }
init(_ i: Int) { self.i = i }
}
let arrC = [C(1),C(2)]
print(arrC.dynamicType) // Array<C>
let arrO:[AnyObject] = arrC
print(arrO.dynamicType) // Array<AnyObject>
arrO.forEach { (o) -> () in
//o.foo() // error: value of type 'AnyObject' has no member 'foo'
(o as? C)?.foo()
}
您尝试做的事情(如果我理解您的问题)将 [C] 转换为 [AnyObject]
let c = arrC
let o = c as [AnyObject]
print(c.dynamicType, o.dynamicType) // Array<C> Array<AnyObject>
这是有效的。如果您收到错误,请提供更多代码,以便我们查看您的问题所在。
如果您尝试将 [AnyObject] 强制转换为 [C],则错误消息似乎有效。是的,这样的转换是非法的,因为 AnyObject 不是 C 的类型。 AnyObject 是所有类都遵守的协议