我想定义一个在Viper架构中使用的协议,使用具有弱属性的协议在Viper组件之间建立连接但是我收到以下错误消息:
'weak'可能只适用于类和类绑定协议类型, 不是'Self.ViperViewClass'
protocol ViperPresenter: class {
associatedtype ViperViewClass
weak var view: ViperViewClass! { get set }
}
答案 0 :(得分:10)
协议目前无法要求将属性实现为weak
存储属性。
虽然目前允许weak
和unowned
关键字用于属性要求,但它们不起作用。以下是完全合法的:
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 bug,SE-0186将在协议中的属性要求中使用weak
和unowned
作为Swift 4.1中的警告(在Swift 3和4种模式),以及Swift 5中的错误。
但即使协议 要求将属性实现为weak
或unowned
存储属性,编译器也需要知道ViperViewClass
是一个类类型(即通过说associatedtype ViperViewClass : AnyObject
)。