13
我有点困惑。 protocol A : class { ... }
和protocol A{ ... }
之间有什么区别,我们应该使用哪一个?swift协议'弱'不能应用于非班级类型
PS:当我们写这样
protocol A{ ... }
weak var delegate: A
错误,我们得到了一个错误:“弱”无法适用于非类类型
我有点困惑。 protocol A : class { ... }
和protocol A{ ... }
之间有什么区别,我们应该使用哪一个?swift协议'弱'不能应用于非班级类型
PS:当我们写这样
protocol A{ ... }
weak var delegate: A
错误,我们得到了一个错误:“弱”无法适用于非类类型
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
。
因此,一般来说,如果您需要采用协议的类型为引用类型而不是值类型,那么您将定义仅类别协议。
在你的代码示例中,你说''''是'let'常量'。我有点困惑。这里“a”是什么常数? – Suragch
@Suragch:函数参数 - 作为'func foo(a:A)'中的'a' - 默认为* constants *。 –