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 存储属性。

虽然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 bug,SE-0186 将在协议中的属性要求上使用weakunowned,在 Swift 4.1(在 Swift 3 和 4 模式下)发出警告,并在斯威夫特 5。

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

【讨论】:

以上是关于Swift 协议中的弱属性只能是类或类绑定协议类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift中的协议

协议中的 Swift 协议属性 - 候选人的类型不匹配

iOS Swift delegate的使用

Swift学习第八枪--协议

任何不一致的铸造?在可选绑定期间进入 Swift 中的协议

swift3.0 扩展协议