2015-11-02 64 views
13

我有点困惑。 protocol A : class { ... }protocol A{ ... }之间有什么区别,我们应该使用哪一个?swift协议'弱'不能应用于非班级类型

PS:当我们写这样

protocol A{ ... } 

weak var delegate: A 

错误,我们得到了一个错误:“弱”无法适用于非类类型

回答

32
protocol A : class { ... } 

定义"class-only protocol":只有类类型(而不是结构或枚举)可以采用这个协议。

弱引用仅定义为引用类型。类 是引用类型,结构和枚举是值类型。 (闭包也是参考类型,但闭包不能采用 协议,所以它们在这种情况下无关。)因此,如果您的 协议定义了弱属性,那么该协议必须是 类专用协议。

这里是这需要一个唯一的类的协议的另一个示例:

protocol A { 
    var name : String { get set } 
} 

func foo(a : A) { 
    a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant 
} 

这并不因为结构和枚举的情况下编译,a.name = "bar"a的突变。如果定义 协议作为

protocol A : class { 
    var name : String { get set } 
} 

然后编译器知道a是一个类类型到 a的实例的对象存储的引用, 和a.name = "bar"修改引用的对象,但不a

因此,一般来说,如果您需要采用协议的类型为引用类型而不是值类型,那么您将定义仅类别协议。

+0

在你的代码示例中,你说''''是'let'常量'。我有点困惑。这里“a”是什么常数? – Suragch

+0

@Suragch:函数参数 - 作为'func foo(a:A)'中的'a' - 默认为* constants *。 –

相关问题