如何将 [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