37

私はSwift 2を使用しており、弱いオブジェクトのセットを保存する方法としてWeakContainerを使用しています。NSHashTable.weakObjectsHashTable()

struct WeakContainer<T: AnyObject> {
    weak var value: T?
}

public protocol MyDelegate : AnyObject {

}

次に、ViewController で宣言します。

public var delegates = [WeakContainer<MyDelegate>]

しかし、それはエラーです

MyDelegate をプロトコル AnyObject に準拠する具象型として使用することはサポートされていません

エラーは、メンバーWeakContainervalueとして宣言されてweakいるため、オブジェクトであるTと予想されます。しかし、私も , と宣言MyDelegateAnyObjectます。これを回避する方法は?

4

6 に答える 6

18

弱いコンテナを実装しようとしたときに、同じ問題に遭遇しました。上記のコメントで @plivesey が指摘しているように、これはSwift 2.2 / Xcode 7.3のバグのようですが、動作すると予想されます。

ただし、一部の Foundation プロトコルでは問題は発生しません。たとえば、これは次のようにコンパイルされます。

let container = WeakContainer<NSCacheDelegate>()

@objcこれは、属性でマークされたプロトコルで機能することがわかりました。これを回避策として使用できます。

回避策 1

@objc
public protocol MyDelegate : AnyObject { }

let container = WeakContainer<MyDelegate>() // No compiler error

これにより他の問題が発生する可能性があるため (一部の型は Objective-C で表現できません)、別の方法を次に示します。

回避策 2

コンテナーから要件を削除し、値を内部的AnyObjectにキャストします。AnyObject

struct WeakContainer<T> {
  private weak var _value:AnyObject?
  var value: T? {
    get {
      return _value as? T
    }
    set {
      _value = newValue as? AnyObject
    }
  }
}

protocol MyDelegate : AnyObject { }

var container = WeakContainer<MyDelegate>() // No compiler error

警告: に準拠しているTが ではない値を設定するAnyObjectと失敗します。

于 2016-04-28T11:27:30.930 に答える
5

なぜジェネリックを使おうとしているのですか?次のことをお勧めします。

import Foundation
import UIKit

protocol MyDelegate : AnyObject {

}

class WeakContainer : AnyObject {
    weak var value: MyDelegate?
}

class ViewController: UIViewController {
    var delegates = [WeakContainer]()
}

NSValueのもありますnonretainedObject

于 2015-11-10T03:45:33.787 に答える