Protocols和类绑定Protocols之间有什么区别?我们应该在Swift中使用哪一种?
protocol A : class { ... } protocol A { ... }
如果协议未定义为: class,则尝试添加weak委托时会出现错误:
: class
weak
protocol A { ... } weak var delegate: A
给出错误:"weak"不能应用于非类类型或"weak"不能应用于非类绑定的"A";考虑添加具有类界限的协议一致性
0yycz8jy1#
雨燕〉= 4:
protocol A : AnyObject { ... }
雨燕〈4:
protocol A : class { ... }
定义了“仅类协议”:只有类类型(而不是结构或枚举)可以采用此协议。弱引用只为 * 引用类型 * 定义。类是引用类型,结构和枚举是值类型。(闭包也是引用类型,但是闭包不能采用协议,所以它们在这个上下文中是不相关的。)因此,如果符合协议的对象需要存储在弱属性中,则该协议必须是仅类协议。下面是另一个需要仅类协议的示例:
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的变体。
a.name = "bar"
a
protocol A : class { var name : String { get set } }
则编译器知道a是类类型的示例,而a是对对象存储器的引用,并且a.name = "bar"修改被引用的对象,但不修改a。因此,一般来说,如果您需要采用协议的类型是引用类型而不是值类型,则可以定义一个仅类协议。
ws51t4hk2#
如果您使用的是Swift 4或更高版本,请使用AnyObject:
AnyObject
如前所述使用class会发出警告并进行修复:不推荐使用“class”关键字定义类约束协议;请改用“AnyObject”将“类”替换为“AnyObject”
class
vfwfrxfs3#
您可以使协议从任何类类型(如NSObject或AnyObject)派生:
protocol TopNewsTableDelegate : AnyObject { func topNewsTableDidLoadedStories() }
czfnxgou4#
或者你可以这样打字
@objc protocol A { ... }
则可以创建弱委托引用
qnyhuwrf5#
protocol CustomProtocolName : NSObjectProtocol { // ... }
5条答案
按热度按时间0yycz8jy1#
雨燕〉= 4:
雨燕〈4:
定义了“仅类协议”:只有类类型(而不是结构或枚举)可以采用此协议。
弱引用只为 * 引用类型 * 定义。类是引用类型,结构和枚举是值类型。(闭包也是引用类型,但是闭包不能采用协议,所以它们在这个上下文中是不相关的。)
因此,如果符合协议的对象需要存储在弱属性中,则该协议必须是仅类协议。
下面是另一个需要仅类协议的示例:
这不会编译,因为对于结构和枚举的示例,
a.name = "bar"
是a
的变体。则编译器知道
a
是类类型的示例,而a
是对对象存储器的引用,并且a.name = "bar"
修改被引用的对象,但不修改a
。因此,一般来说,如果您需要采用协议的类型是引用类型而不是值类型,则可以定义一个仅类协议。
ws51t4hk2#
如果您使用的是Swift 4或更高版本,请使用
AnyObject
:如前所述使用
class
会发出警告并进行修复:不推荐使用“class”关键字定义类约束协议;请改用“AnyObject”
将“类”替换为“AnyObject”
vfwfrxfs3#
您可以使协议从任何类类型(如NSObject或AnyObject)派生:
czfnxgou4#
或者你可以这样打字
则可以创建弱委托引用
qnyhuwrf5#