【问题标题】:Weak property in a Swift protocol may only be a class or class-bound protocol typeSwift 协议中的弱属性只能是类或类绑定协议类型
【发布时间】:2018-05-21 20:10:54
【问题描述】:
我想定义一个在 Viper 架构中使用的协议,以使用具有弱属性的协议在 Viper 组件之间建立连接,但我收到以下错误消息:
'weak' 只能应用于类和类绑定协议类型,
不是'Self.ViperViewClass'
protocol ViperPresenter: class {
associatedtype ViperViewClass
weak var view: ViperViewClass! { get set }
}
【问题讨论】:
标签:
swift
types
protocols
weak-references
【解决方案1】:
协议目前不能要求将属性实现为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 模式下)发出警告,并在斯威夫特 5。
但即使协议可能要求属性实现为weak 或unowned 存储属性,编译器也需要知道ViperViewClass 是一个类类型(即通过说associatedtype ViperViewClass : AnyObject)。