3

我有一个自定义类数组[CustomClass]。我正在尝试将其转换为[AnyObject].

self.customClassArray = self.anyObjectArray as [AnyObject]

我收到以下错误:

“AnyObject”不是“CustomClass”的子类型

无法将类型“[CustomClass]”的值强制转换为类型“[AnyObject]”。

我错过了什么?

4

3 回答 3

6

基本上没有你必须将你的CustomClass转换为AnyObject.

您的自定义类是的子类型,AnyObject而不是相反,因此任何需要 an 的函数AnyObject都可以处理您的CustomClass

于 2016-02-11T08:04:59.257 回答
3

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

于 2016-02-11T09:34:19.280 回答
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 是所有类都遵守的协议

于 2016-02-11T08:32:12.183 回答