Swift协议中的弱属性可能只是类或类绑定协议类型

时间:2017-12-07 16:44:35

标签: swift types protocols weak-references

我想定义一个在Viper架构中使用的协议,使用具有弱属性的协议在Viper组件之间建立连接但是我收到以下错误消息:

  

'weak'可能只适用于类和类绑定协议类型,   不是'Self.ViperViewClass'

protocol ViperPresenter: class {

    associatedtype ViperViewClass
    weak var view: ViperViewClass! { get set }

}

1 个答案:

答案 0 :(得分:10)

协议目前无法要求将属性实现为weak存储属性。

虽然目前允许weakunowned关键字用于属性要求,但它们不起作用。以下是完全合法的:

class C {}

protocol P {
  weak var c: C? { get set }
}

struct S : P {
  var c: C? // strong reference to a C instance, not weak.
}

这是filed as a bugSE-0186将在协议中的属性要求中使用weakunowned作为Swift 4.1中的警告(在Swift 3和4种模式),以及Swift 5中的错误。

但即使协议 要求将属性实现为weakunowned存储属性,编译器也需要知道ViperViewClass是一个类类型(即通过说associatedtype ViperViewClass : AnyObject)。