Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 什么时候应该使用仅类协议而不是@objc?_Swift - Fatal编程技术网

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相关功能,例如:

    • 仿制药
    • 元组
    • 快速枚举
    但不管怎样,我还是会坚持使用swift协议来进行纯粹的风格选择。

    我同意“纯粹的风格选择”: