我理解“@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 回答
@objc
关于类声明意味着带注释的类将暴露给Objective-C运行时 . 但是还有其他隐含的差异,但我认为这是最重要的差异 .您可以尝试从纯Swift类(而不是NSObject的子类)中省略注释,然后您无法在Objective-C代码中使用此类(它不会出现在Objective-C使用的生成头文件中)码) .
Note 任何继承
NSObject
或其任何子类的类都将自动(隐式)标记为@objc
. 因此,将UIViewController
的子类明确标记为@objc
是没有意义的,因为Swift编译器会为您执行此操作 .在this page,它说
所以,不同之处在于它隐含地适用于所有成员 . 此外,您将无法将
@objc
添加到泛型类 .