2016-12-08 153 views
4

當我在課堂上的擴展聲明靜態參數上,然後我有變量之前寫@nonobjc像當@objc和@nonobjc在swift中寫入方法和變量之前?

@nonobjc static let test = "test" 

,有時我有方法之前寫@objc,那麼什麼是使用@objc和@nonobjc的迅速。

任何人都可以幫我解決這個問題嗎?

+1

[Swift Language Reference - Attributes](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html) – dfri

回答

10

這在Apple's official documentation約Objective-C的解釋 - 斯威夫特的互操作性:

當您使用@objc(名稱)屬性上的雨燕類,類是 在Objective-C提供無任何命名空間。因此,在將可歸檔的 Objective-C類遷移到Swift時,此屬性也可能非常有用。由於歸檔對象在歸檔中存儲了其類名稱 ,因此應該使用@objc(name)屬性 指定與您的Objective-C類相同的名稱,以便舊的 歸檔可以由新的Swift類取消歸檔。

相反,Swift還提供了@nonobjc屬性,這使得在Objective-C中的Swift聲明不可用 。您可以使用它來解析橋接方法的循環性,並允許爲Objective-C導入的類重載 方法。如果Objective-C方法 被無法在 Objective-C中表示的Swift方法覆蓋,例如通過將參數指定爲變量,則該方法必須標記爲@nonobjc。

總而言之,如果要將不帶名稱空間的Swift屬性公開給Objective-C,請使用@objc。 User @nonobjc如果你想保持該屬性只有Swift代碼可用和可訪問。

1

(附錄/附加官員@bontoJR細節以及總結的答案):

Swift Language Reference - Attributes [重點煤礦]:

objc

應用此屬性的任何聲明可以代表英寸 Objective-C的 - 例如,非嵌套類,協議,非泛型 枚舉(約束到整數原始值類型),屬性和 方法(包括getter和setter)的類和協議, 初始化器,deinitializers,和標。 objc屬性告訴 編譯器聲明可用於Objective-C 代碼

...

nonobjc

應用此屬性的方法,屬性,下標,或初始化器 聲明抑制的隱式objc屬性。儘管可以在 Objective-C中表示它,但nonobjc 屬性會通知編譯器使該聲明在 Objective-C代碼中不可用。

...

0

在這裏,你可以找到在這個Swift Documentation : InteractingWithObjective-C

由於您的問題的回答更多的細節,從附加鏈接概述如下所示。

@objc:您可以使用屬性,因爲它是暴露在Objective-C代碼中 你的界面改變類,屬性,方法,枚舉類型,或枚舉的情況下申報的名稱。

:如果你的雨燕類的名稱中包含不被Objective-C的支持的字符,你可以提供一個替代名稱在Objective-C使用。

@nonobjc:它使Objective-C中的快速聲明不可用。您可以使用它來解析循環以橋接 方法,並允許重載由 Objective-C導入的類的方法。