カスタム class の配列があります[CustomClass]。に変換しようとしてい[AnyObject]ます。
self.customClassArray = self.anyObjectArray as [AnyObject]
次のエラーが表示されます。
「AnyObject」は「CustomClass」のサブタイプではありません
と
タイプ '[CustomClass]' の値を強制的にタイプ '[AnyObject]' に変換できません。
私は何が欠けていますか?
CustomClass基本的に、 toにキャストする必要があるシナリオはありませんAnyObject。
カスタム クラスは のサブタイプでAnyObjectあり、その逆ではないため、 を必要とする関数はすべて、AnyObjectあなたのCustomClass
1.) スーパークラス オブジェクトをサブクラス タイプに変換できます。
2.) SubClass タイプのオブジェクトを SuperClass に変換することはできません。
これが継承の一般的なルールです。
同じルールがプロトコルの採用にも適用されます。
たとえば、3 つのクラスがあるとします。クラス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 型へ
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 は、すべてのクラスが準拠するプロトコルです。