2016-08-31 8 views
0

一般的なデータ構造で弱い参照を使いたいと思っています。例えば、配列の下の の例では、一般的に任意のジェネリック型です。私はほとんどそれが :(プロトコルとしてタイプされたSwift汎用データ構造で弱い参照を使用するにはどうすればよいですか?

私の実験がうまくスタートを切った仕事を得ることができます。以下の作品:私は配列をしたいとき

// Array of weak references that implements a protocol OK 
protocol P: AnyObject { // Note AnyObject 
    var i: Int { get } 
} 
class CP: P { 
    var i: Int = 0 
} 
let cP = CP() // Strong reference to prevent collection 
let weakCPs = [WeakReference(value: cP)] // OK 
print("CP: \(weakCPs[0].value!.i)") // 0 

しかし:私は、プロトコルを追加することができます

// Array of weak references OK 
struct WeakReference<T: AnyObject> { 
    weak var value: T? 
} 
class C { 
    var i: Int = 0 
} 
let c = C() // Strong reference to prevent collection 
let weakCs = [WeakReference(value: c)] // OK 
print("C: \(weakCs[0].value!.i)") // 0 

私はエラーを取得するプロトコルへの弱参照の:

// Array of weak references of a protocol not OK 
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Using 'P' as 
a concrete type conforming to protocol 'AnyObject' is not supported 
print("P: \(weakPs[0].value!.i)") // 0 

私は、HA何かがありますお見逃しですか?

'AnyObject'に準拠した具体的な型として 'P'を使用するとエラーメッセージ "AnyObject 'はサポートされていません。これはコンパイラの の一時的な制限であることを示しています。これは修正される予定ですか?私はバグレポートを提出すべきですか?何かアドバイスを事前に

おかげで、

- ハワード。

// Array of weak references of a protocol OK so long as protocol marked @objc 
@objc protocol P { // Note @objc 
    var i: Int { get } 
} 
class CP: P { 
    var i: Int = 0 
} 
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Note typed as `[WeakReference<P>]` 
print("P: \(weakPs[0].value!.i)") // 0 

作品は:)

あなたが@objc使用する必要があり、したがって、ない純粋スウィフトソリューションが、私はiOS版の午前以来ではないことを迷惑です:私の周りに遊ぶ

答えて

0

があることを見出しました私のための問題。

関連する問題