如何将 [CustomClass] 转换为 [AnyObject]
How to convert [CustomClass] to [AnyObject]
我有一个自定义数组 class [CustomClass]
。我正在尝试将其转换为 [AnyObject]
。
self.customClassArray = self.anyObjectArray as [AnyObject]
我收到以下错误:
'AnyObject' is not a subtype of 'CustomClass'
和
Cannot convert value of type '[CustomClass]' to type '[AnyObject]' in coercion.
我错过了什么?
基本上没有您必须将 CustomClass
转换为 AnyObject
的情况。
您的自定义 class 是 AnyObject
的子类型,而不是相反,因此任何需要 AnyObject
的函数都可以处理您的 CustomClass
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 是一个协议,所有 类 都遵守
1.) 您可以将 superClass 对象转换为 Subclass 类型。
2.) 您不能将 SubClass 类型的对象转换为 SuperClass。
这是继承的一般规则。
同样的规则也适用于协议采用。
例如假设你有三个 classes。
Class A,B,C.
Class A {
}
Class B 是 A 的 class
Class B : A {
}
Class C 是 A 的 class
Class C : A {
}
换句话说,你可以说 A 是 class B 和 class c 的超 Class。
您有如下对象。
var objA = A()
var objB = B()
var objC = C()
在这种情况下,您可以将 objA 转换为 Class B 或 C 的类型,即
let objB1 = objA as! B //success
let objC1 = objA as! C //success
但是您不能手动将 objB 或 objC 转换为 Class A 的类型。即
let objA1 : A = objB as! A //will not allowed
您可以将类型 Class B 或 C 的对象存储为类型 class A 而无需强制转换。即
let objA2 : A = objB; // objB is type of class B.
let objA3 : A = objC; // objC is type of class C.
然后您可以在需要时将 objA2 转换为 class B 类型,例如
let objB3 = objA2 as! B
AnyObject 是 Swift 中的协议。
The protocol to which all classes implicitly conform.
@objc protocol AnyObject
您不需要手动实施此协议,它是隐含的。
Class A,B,C同样采用AnyObject协议,
因此您可以将 A、B 或 C 的对象存储为 AnyObject 类型。
就像我们上面的语句:: let objA2 : A = objB; // objB 是 class B.
的类型
let anyObj1 : AnyObject = objA
let anyObj2 : AnyObject = objB
let anyObj3 : AnyObject = objC
您无法手动转换为类型 AnyObject。可以直接如上存储。
然后你可以稍后转换,
anyObj1 输入 A
anyObj2 输入 B
anyObj3 输入 C
我有一个自定义数组 class [CustomClass]
。我正在尝试将其转换为 [AnyObject]
。
self.customClassArray = self.anyObjectArray as [AnyObject]
我收到以下错误:
'AnyObject' is not a subtype of 'CustomClass'
和
Cannot convert value of type '[CustomClass]' to type '[AnyObject]' in coercion.
我错过了什么?
基本上没有您必须将 CustomClass
转换为 AnyObject
的情况。
您的自定义 class 是 AnyObject
的子类型,而不是相反,因此任何需要 AnyObject
的函数都可以处理您的 CustomClass
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 是一个协议,所有 类 都遵守
1.) 您可以将 superClass 对象转换为 Subclass 类型。
2.) 您不能将 SubClass 类型的对象转换为 SuperClass。
这是继承的一般规则。
同样的规则也适用于协议采用。
例如假设你有三个 classes。 Class A,B,C.
Class A {
}
Class B 是 A 的 class
Class B : A {
}
Class C 是 A 的 class
Class C : A {
}
换句话说,你可以说 A 是 class B 和 class c 的超 Class。
您有如下对象。
var objA = A()
var objB = B()
var objC = C()
在这种情况下,您可以将 objA 转换为 Class B 或 C 的类型,即
let objB1 = objA as! B //success
let objC1 = objA as! C //success
但是您不能手动将 objB 或 objC 转换为 Class A 的类型。即
let objA1 : A = objB as! A //will not allowed
您可以将类型 Class B 或 C 的对象存储为类型 class A 而无需强制转换。即
let objA2 : A = objB; // objB is type of class B.
let objA3 : A = objC; // objC is type of class C.
然后您可以在需要时将 objA2 转换为 class B 类型,例如
let objB3 = objA2 as! B
AnyObject 是 Swift 中的协议。
The protocol to which all classes implicitly conform.
@objc protocol AnyObject
您不需要手动实施此协议,它是隐含的。
Class A,B,C同样采用AnyObject协议,
因此您可以将 A、B 或 C 的对象存储为 AnyObject 类型。
就像我们上面的语句:: let objA2 : A = objB; // objB 是 class B.
的类型let anyObj1 : AnyObject = objA
let anyObj2 : AnyObject = objB
let anyObj3 : AnyObject = objC
您无法手动转换为类型 AnyObject。可以直接如上存储。
然后你可以稍后转换,
anyObj1 输入 A
anyObj2 输入 B
anyObj3 输入 C