首页 文章

需要澄清Swift中的“@objc类”

提问于
浏览
1

我理解“@objc”属性对协议的作用 . 我不明白为什么它被添加到类中,例如在以下示例中:

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

@objc class Counter {
    var count = 0
    var dataSource: CounterDataSource?
    func increment() {
        if let amount = dataSource?.incrementForCount?(count) {
            count += amount
        } else if let amount = dataSource?.fixedIncrement {
            count += amount
        }
    }
}

以下是Apple的Swift文档中的内容:

另请注意,@ objc协议只能由类采用,而不能由结构或枚举采用 . 如果将协议标记为@objc以指定可选要求,则只能将该协议应用于类类型 .

没有解释“@objc class ..”,只有“@objc protocol” .

2 回答

  • 0

    @objc 关于类声明意味着带注释的类将暴露给Objective-C运行时 . 但是还有其他隐含的差异,但我认为这是最重要的差异 .

    您可以尝试从纯Swift类(而不是NSObject的子类)中省略注释,然后您无法在Objective-C代码中使用此类(它不会出现在Objective-C使用的生成头文件中)码) .

    Note 任何继承 NSObject 或其任何子类的类都将自动(隐式)标记为 @objc . 因此,将 UIViewController 的子类明确标记为 @objc 是没有意义的,因为Swift编译器会为您执行此操作 .

  • 1

    this page,它说

    如果将objc属性应用于类或协议,则会将其隐式应用于该类或协议的成员 . 编译器还隐式地将objc属性添加到从另一个标记有objc属性的类继承的类中 . 使用objc属性标记的协议不能从不是的协议继承 .

    所以,不同之处在于它隐含地适用于所有成员 . 此外,您将无法将 @objc 添加到泛型类 .

相关问题