什么时候应该使用仅限类的协议而不是@objc?

时间:2014-12-11 11:28:15

标签: swift

当我们想要将协议采用限制为类类型时,我们可以使用:class协议或@objc协议。

但是,我没有看到“仅类协议”优于@objc协议的优势。

我知道的差异:

  1. 尺寸
    @objc更节省空间。

    @objc protocol ProtocolObjC {}
    protocol ProtocolClass: class {}
    
    sizeof(ProtocolObjC)  // -> 8
    sizeof(ProtocolClass) // -> 16
    
  2. 检查协议一致性
    仅适用于@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'
    
  3. 可选协议要求
    仅适用于@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
    }
    
  4. 那么,是否有任何使用: 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}
    }
    

    所有这些都会导致编译错误。

1 个答案:

答案 0 :(得分:1)

我认为它们是两个不相同的东西,不能相互比较。

我的经验法则是应始终使用本机swift协议,除非需要objc兼容性,或者除非只需要通过@objc提供某个功能..

然而,使用swift协议的优点是可以使用objc中不可用的所有快速相关功能,例如:

  • 泛型
  • 元组
  • swift enums

但无论如何,我仍然坚持使用快速协议进行纯粹的风格选择。