当我们想要将协议采用限制为类类型时,我们可以使用:class
协议或@objc
协议。
但是,我没有看到“仅类协议”优于@objc
协议的优势。
我知道的差异:
尺寸
@objc
更节省空间。
@objc protocol ProtocolObjC {}
protocol ProtocolClass: class {}
sizeof(ProtocolObjC) // -> 8
sizeof(ProtocolClass) // -> 16
检查协议一致性
仅适用于@objc
协议
@objc protocol ProtocolObjC {}
protocol ProtocolClass: class {}
let obj:AnyObject = NSObject()
obj is ProtocolObjC // -> false
obj is ProtocolClass // < [!] error: cannot downcast from 'AnyObject' to non-@objc protocol type 'ProtocolClass'
可选协议要求
仅适用于@objc
协议
@objc protocol ProtocolObjC {
optional func foo()
}
protocol ProtocolClass: class {
optional func foo() // < [!] error: 'optional' can only be applied to members of an @objc protocol
}
那么,是否有任何使用: class
协议的用例?或者有人知道@objc
的任何缺点?
增加:谢谢@Antonio!
enum MyEnum { case A,B,C }
@objc protocol ProtoObjC {
// Generics
typealias FooType
var foo:FooType {get set}
// Tuple
var bar:(Int,Int) {get set}
// Enum
var baz:MyEnum {get set}
}
所有这些都会导致编译错误。
答案 0 :(得分:1)
我认为它们是两个不相同的东西,不能相互比较。
我的经验法则是应始终使用本机swift协议,除非需要objc兼容性,或者除非只需要通过@objc提供某个功能..
然而,使用swift协议的优点是可以使用objc中不可用的所有快速相关功能,例如:
但无论如何,我仍然坚持使用快速协议进行纯粹的风格选择。