Notification.Name
在Objective-C中不存在。而Objective-C類型NotificationName
實際上只是一個NSString
。要在Objective-C中使用Swift,這個類必須在兩者中都可用,並且不能是Swift結構(比如說Notification
或String
)。
做你想要什麼,那麼,你需要有兩個擴展:
- 一個雨燕
Notification.Name
,因爲你;和
- 一個用於Objective-C對象(
NSString
,或者如果您願意的話可能爲NSNotification
)。
1)一個Objective-C兼容的對象擴展添加到您的斯威夫特文件:
public extension NSNotification {
public static let blahblahblah: NSString = "blahblahblah"
}
注:雨燕4,properties must be computed的Objective-C的兼容性。這將是這樣的:
public extension NSNotification {
public static var blahblahblah: NSString {
return "blahblahblah"
}
}
注意var
在計算性能:計算性能不可能一成不變,所以不能用let
。
2)在Objective-C的文件,導入Xcode的生成斯威夫特頭文件(以下任何其他進口):
#import "YourProjectName-Swift.h"
注:與你的項目的實際名稱替換YourProjectName
。所以,如果你的項目被命名爲「CoolGameApp」,Swift頭將是「CoolGameApp-Swift.h」。如果您的項目名稱中包含空格,例如「酷遊戲應用程序」,請用短劃線替換它們:「Cool-Game-App-Swift.h」
3)重建項目。現在
,你應該能夠訪問Objective-C的擴展:
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
它爲我工作。 我試圖使用'@ objc',但它只能用於類和協議的成員,而不能用於擴展。 謝謝@leanne –
還有一件事,對於'擴展NSNotification',我使用'let'而不是'var',它工作。 (顯然,它應該工作),所以沒有必要使用計算屬性,如果有一個常量字符串。 而我們甚至不需要'public static',只有'extension'應該公開。 –
對,Swift 3不需要計算屬性;根據文檔,Swift 4的確如此。並使其成爲靜態的意味着它在課堂上可用而不需要實例。快樂的編碼! (請務必點擊複選標記以表明我的答案適合您。) – leanne