如何将[CustomClass]转换为[AnyObject]

时间:2016-02-11 08:02:00

标签: ios arrays swift anyobject

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

self.customClassArray = self.anyObjectArray as [AnyObject]

我收到以下错误:

  

'AnyObject'不是'CustomClass'的子类型

  

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

我错过了什么?

3 个答案:

答案 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是所有类符合的协议