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

Ado*_*els 5 types protocols weak-references swift

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

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

protocol ViperPresenter: class {

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

}
Run Code Online (Sandbox Code Playgroud)

Ham*_*ish 11

协议当前不能要求将属性实现为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.
}
Run Code Online (Sandbox Code Playgroud)

这是作为一个错误提交的,SE-0186将在协议中使用weakunowned在属性要求上使用Swift 4.1中的警告(在Swift 3和4模式下),以及Swift 5中的错误.

但是,即使协议可能需要属性被实现为weakunowned存储性能,编译器需要知道,ViperViewClass是一个类类型(按即说
associatedtype ViperViewClass : AnyObject).