2015-08-15 159 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