当我们想要将协议采用限制到类类型时,我们可以使用: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}
}
所有这些都会导致编译错误。
最佳答案
我认为他们是两个不可比较的东西。
我的经验法则是,除非需要objc兼容性,或者只需要通过@objc提供的某个功能,否则应该始终使用本机swift协议。
然而,使用swift协议的优势在于,可以使用objc中不可用的所有swift相关功能,例如:
仿制药
元组
斯威夫特Enums
但不管怎样,我还是会坚持使用快速的协议来进行纯粹的风格选择。
关于swift - 什么时候应该使用仅限类的协议(protocol)而不是@objc?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27421779/