簡體   English   中英

如何使用從swift 3到Objective-C的Notification.Name擴展

[英]how to use Notification.Name extension from swift 3 to Objective-C

我為Notification.Name創建了一個擴展,如下所示:

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

}

現在我想在Objective-C中使用這個擴展,但即使它是公共的也無法訪問。

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

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

我在swift文件中的擴展名

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

@objc 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")
}

@ leanne的回答非常有幫助

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

要做你想做的事,那么你需要有兩個擴展:

  • 一個用於Swift Notification.Name ,就像你一樣; 和,
  • 一個用於Objective-C對象(例如, NSString ,或者如果您願意,可能是NSNotification )。

1)向Swift文件添加與Objective-C兼容的對象擴展:

public extension NSNotification {
    public static let blahblahblah: NSString = "blahblahblah"
}

注意:在Swift 4中, 必須為Objective-C兼容性計算屬性 那看起來像是:

@objc public extension NSNotification {
    public static var blahblahblah: NSString {
        return "blahblahblah"
    }
}

注意計算屬性中的var :計算屬性不能是不可變的,所以不能使用let

2)在Objective-C文件中,導入Xcode生成的Swift頭文件(在任何其他導入之下):

#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];

除了這里的答案之外,在我的Obj-C代碼可以看到它之前,我必須將@objc添加到我的NSNotification擴展中(Swift 4)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM