zoukankan      html  css  js  c++  java
  • @objc

    Swift 和 Objective-C 的互调这个话题很大,今天我们重点看看其中一个小的知识点:@objc的使用。

    用法

    在 Swift 代码中,使用@objc修饰后的类型,可以直接供 Objective-C 调用。可以使用@objc修饰的类型包括:

    • 未嵌套的类
    • 协议
    • 非泛型枚举(仅限于原始值为整形的类型)
    • 类和协议中的属性和方法
    • 构造器和析构器
    • 下标

    我们逐个来看看实际的使用:

    @objc class MyHelper:NSObject {
    // class code
    }

    Objective-C 中所有的类都需要继承自NSObject,Swift 中的类需要供 Objective-C 调用的时候,自然也需要继承自NSObject(谢谢网友潇小溅纠错:Swift 中声明继承NSObject 的类,不需要显式使用 @objc 修饰, Swift 编译器会默认加上)。当然,你也可以继承所有 Objective-C 中的类,因为他们本身也继承自NSObject:

    @objc class MyViewController : UIViewController {

    }

    另外一个细节是,Swift 中的类名,可以使用中文命名,而 Objective-C 中的却只能使用 ASCII 码,在使用@objc时,需要指定 Objective-C 中使用的 ASCII 名称。这个知识点请参见喵神的 tips

    @objc(MyClass)
    class 我的类: NSObject {
    @objc(greeting:)
    func 打招呼(名字: String) {
    print("哈喽,(名字)")
    }
    }

    协议

    @objc修饰协议与修饰类一样,需要注意的是,如果协议中有optional修饰的方法,就必须使用@objc来修饰:

    @objc protocol CounterDataSource {
    optional func incrementForCount(count: Int) -> Int
    optional var fixedIncrement: Int { get }
    }

    关于可选协议的描述,可以参见官方教程

    枚举

    Swift 中的枚举类型,功能增强了不少。Objective-C 中还是传统的枚举类型,必须使用整型作为原始值。这样看来,Swift 中的枚举类型如果要被@objc修饰,则需要满足原始值是整型的限制条件。不然就会报编译错误。
    关于如何在 Objective-C 中使用 Swift 枚举类型,可以见这个帖子:

    // Swift
    @objc enum Bear: Int {
    case Black, Grizzly, Polar
    }

    // OC
    Bear type = BearBlack;
    switch (type) {
    case BearBlack:
    case BearGrizzly:
    case BearPolar:
    [self runLikeHell];
    }

    其他

    在类和协议中的属性和方法,构造器和析构器,下标中使用@objc修饰的用法与上面的用法一样。这里举一个官网的例子说明:

    @objc class ExampleClass: NSObject {
    var enabled: Bool {
    @objc(isEnabled) get {
    // Return the appropriate value
    }
    }
    }

    需要注意的是,如果类中方法或者属性被@objc修饰,那么类就必须被@objc修饰。

    stackoverflow 相关问题整理

    参考资料

  • 相关阅读:
    gsm at 指令
    wm8976 codec
    【Gym 100971J】Robots at Warehouse
    【XDU1144】合并模板
    腾讯云CentOS7安装LNMP+wordpress
    【USACO1.1】Broken Necklace
    【校赛小分队之我们有个女生】训练赛6
    【计导作业】——商品记录
    C 文件读写2
    C 文件读写1
  • 原文地址:https://www.cnblogs.com/baitongtong/p/6897559.html
Copyright © 2011-2022 走看看