我有一个自定义类[CustomClass]
的数组。我正在尝试将其转换为[AnyObject]
。
self.customClassArray = self.anyObjectArray as [AnyObject]
我收到以下错误:
'AnyObject'不是'CustomClass'的子类型
和
无法将'[CustomClass]'类型的值转换为强制类型'[AnyObject]'。
我错过了什么?
答案 0 :(得分:6)
基本上没有必须将CustomClass
投射到AnyObject
的情况。
您的自定义类是AnyObject
的子类型而不是相反,因此任何需要AnyObject
的函数都能够处理您的CustomClass
答案 1 :(得分:3)
1。)您可以将superClass对象转换为Subclass Type。
2.)您无法将SubClass类型的对象转换为SuperClass。
这是继承的一般规则。
同样的规则也适用于协议采用。
E.g。假设你有三个班级。 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的类型而不进行强制转换。即强>
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
答案 2 :(得分:0)
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是所有类符合的协议