2015-08-15 158 views
1

我了解“@objc”属性对于协议的作用。我不明白的是为什么它被添加到类,如下面的例子:需要澄清Swift中的“@objc class”

@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 
     } 
    } 
} 

下面是它在苹果的斯威夫特文件指出:

还要注意@objc协议只能由类来采用,而不能通过结构或枚举来采用。如果您将协议标记为@objc以指定可选需求,则只能将该协议应用于类类型。

没有“@objc类..”的解释,只有“@objc协议”。

回答

0

this page,它说

如果应用objc属性类或协议,它含蓄地应用于类或协议的成员。编译器还隐含地将objc属性添加到继承自另一个具有objc属性的类的类。用objc属性标记的协议不能从不是的协议继承。

所以,区别在于它隐式应用于所有成员。此外,您将被阻止将@objc添加到泛型类。

+0

这解释了很多,但我仍然对它的目的感到好奇。它似乎是将它暴露给objective-c运行时,但为什么我需要如果我在快速编码? –

+0

虽然Swift很棒,但能够从Obj-C代码中调用/访问Swift类和类型真的很有价值。 – jtbandes

1

@objc类声明意味着注释类将暴露给Objective-C运行时。虽然还有其他的内涵差异,但我认为这是最重要的一个。

您可以尝试从纯Swift类(不是NSObject的子类)中省略注释,那么您无法在Objective-C代码中使用此类(它不会出现在使用的genrated头文件中你的Objective-C代码)。

注意任何继承NSObject或其任何子类的类将自动(隐式)标记为@objc。因此,将UIViewController的子类明确标记为@objc是没有意义的,因为Swift编译器会为您做。

+0

谢谢你的解释:)。我的第二个问题是,为什么我需要将我的类暴露给Objective-C?是因为我符合“@objc协议”吗? –

+0

如果你想在同一个项目中混合使用Swift和Objective-C代码,你必须这样做。如果您编写纯Swift应用程序,则不必标记任何类声明'@ objc'。在引擎盖下,如果您的类在Cocoa Touch框架中继承了任何类,那么您的类将自动标记为“@ objc”。该框架是用Objective-C编写的。请参考官方书籍*在Cocoa中使用Swift和Objective-C * – Fujia

+0

“类声明中的@objc表示注释类将暴露给Objective-C运行时。” “暴露给Objective-C运行时”是什么意思?非'@ objc'类如何“不暴露给Objective-C运行时”? – newacct