Swift 什么时候应该使用仅类协议而不是@objc?
当我们想将协议采用限制在类类型时,我们可以使用Swift 什么时候应该使用仅类协议而不是@objc?,swift,Swift,当我们想将协议采用限制在类类型时,我们可以使用:class协议或@objc协议 但是,我没有看到“仅类协议”相对于@objc协议的优势 我知道的区别是: 大小 @objc更节省空间 @objc protocol ProtocolObjC {} protocol ProtocolClass: class {} sizeof(ProtocolObjC) // -> 8 sizeof(ProtocolClass) // -> 16 检查协议一致性 仅适用于@objc协议 @objc
: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 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}
}
所有这些都会导致编译错误。我认为它们是两种不同的东西,不能相互比较 我的经验法则是,应该始终使用本机swift协议,除非需要objc兼容性,或者只需要@objc提供的某个功能 然而,使用swift协议的优点是可以使用objc中不可用的所有swift相关功能,例如:
- 仿制药
- 元组
- 快速枚举