3

カスタム class の配列があります[CustomClass]。に変換しようとしてい[AnyObject]ます。

self.customClassArray = self.anyObjectArray as [AnyObject]

次のエラーが表示されます。

「AnyObject」は「CustomClass」のサブタイプではありません

タイプ '[CustomClass]' の値を強制的にタイプ '[AnyObject]' に変換できません。

私は何が欠けていますか?

4

3 に答える 3

6

CustomClass基本的に、 toにキャストする必要があるシナリオはありませんAnyObject

カスタム クラスは のサブタイプでAnyObjectあり、その逆ではないため、 を必要とする関数はすべて、AnyObjectあなたのCustomClass

于 2016-02-11T08:04:59.257 に答える
3

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 型へ

于 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 に答える