2017-10-18 126 views
3

我創建了一個擴展Notification.Name如下:如何使用Notification.Name擴展迅速,從3到Objective-C

public extension Notification.Name { 
     public static let blahblahblah = Notification.Name(rawValue: "blahblahblah") 

}

現在我想在Objective-C使用這個擴展,但即使其公衆也無法訪問。

你能告訴我如何在Objective-C和Swift中訪問和使用這個swift擴展嗎?

以前我在Objective-C中使用常量值,但現在爲了升級我的代碼,我想使用這個擴展。

回答

2

Notification.Name在Objective-C中不存在。而Objective-C類型NotificationName實際上只是一個NSString。要在Objective-C中使用Swift,這個類必須在兩者中都可用,並且不能是Swift結構(比如說NotificationString)。

做你想要什麼,那麼,你需要有兩個擴展:

  • 一個雨燕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]; 
+0

它爲我工作。 我試圖使用'@ objc',但它只能用於類和協議的成員,而不能用於擴展。 謝謝@leanne –

+0

還有一件事,對於'擴展NSNotification',我使用'let'而不是'var',它工作。 (顯然,它應該工作),所以沒有必要使用計算屬性,如果有一個常量字符串。 而我們甚至不需要'public static',只有'extension'應該公開。 –

+0

對,Swift 3不需要計算屬性;根據文檔,Swift 4的確如此。並使其成爲靜態的意味着它在課堂上可用而不需要實例。快樂的編碼! (請務必點擊複選標記以表明我的答案適合您。) – leanne

2

我的分機在迅速文件

extension Notification.Name { 
    static let purchaseDidFinish = Notification.Name("purchaseDidFinish") 
} 

extension NSNotification { 
    public static let purchaseDidFinish = Notification.Name.purchaseDidFinish 
} 

// OBJECTIVE-C 

#import YourProjectName-Swift.h 

[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(purchaseDidFinish) name:NSNotification.purchaseDidFinish object:nil]; 

// SWIFT 
NotificationCenter.default.addObserver(self, selector: #selector(purchaseDidFinish), name: .purchaseDidFinish, object: nil) 

@objc func purchaseDidFinish(notification: Notification) { 
    print("purchaseDidFinish") 
} 

@李亞男的回答是超級有用