2017-01-05 5 views
0

ジェネリック型のクラスがあり、ジェネリック型にはサブクラス型の制約があります。私は、試してみて、メソッドにクラスのインスタンスを渡しますが、次のコンパイル時のエラーで終わる:SomeTypeがあることが保証されているのでジェネリックサブクラスの型制約を持つオブジェクトをメソッドに渡すときにコンパイル時にエラーが発生する

class A: NSObject { 

    func testB(b: B<NSObject>) { 

    } 
} 

class B<SomeType: NSObject>: NSObject { 

    func test() { 
     let a = A() 
     a.testB(b: self) // <----- The error noted above is shown here 
    } 
} 

以下
Cannot convert value of type 'B<SomeType>' to expected argument type 'B<NSObject>' 

は簡単な例でありますNSObjectのサブクラスを使用すると、B<SomeType>B<NSObject>に変換して渡すことでコンパイラが正常に動作することが期待されます。

クラスAは、SomeTypeNSObjectのサブクラスであり、実際のタイプはSomeTypeではないことのみを認識します。ファンクションがUIViewパラメータを受け取り、UILabelを渡すような場合です。

答えて

1

変更:

func testB(b: B<NSObject>) { 

} 

へ:

func testB<SomeType: NSObject>(b: B<SomeType>) { 

} 

SomeTypeNSObjectに等しくない、NSObjectに制約されるので、これは、動作します。

だからあなたの関数のSomeTypeNSObjectに制約する必要があります。

func testB<SomeType: NSObject>(b: B<SomeType>) { ... }

+0

パーフェクト、感謝を! – ospr

関連する問題