当我们想要将协议采用限制到类类型时,我们可以使用: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/

10-17 01:10