Swift 协议中的弱属性只能是类或类绑定协议类型
Posted
技术标签:
【中文标题】Swift 协议中的弱属性只能是类或类绑定协议类型【英文标题】:Weak property in a Swift protocol may only be a class or class-bound protocol type 【发布时间】:2018-05-21 20:10:54 【问题描述】:我想定义一个在 Viper 架构中使用的协议,以使用具有弱属性的协议在 Viper 组件之间建立连接,但我收到以下错误消息:
'weak' 只能应用于类和类绑定协议类型, 不是'Self.ViperViewClass'
protocol ViperPresenter: class
associatedtype ViperViewClass
weak var view: ViperViewClass! get set
【问题讨论】:
【参考方案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
)。
【讨论】:
以上是关于Swift 协议中的弱属性只能是类或类绑定协议类型的主要内容,如果未能解决你的问题,请参考以下文章