如何使用 Notification.Name 从 Swift 扩展到 Objective-C?
How to use Notification.Name extension from Swift to Objective-C?
我为 Notification.Name
创建了如下扩展:
public extension Notification.Name {
public static let blahblahblah = Notification.Name(rawValue: "blahblahblah")
}
现在我想在 Objective-C 中使用此扩展程序,但即使 public.
也无法访问它
如何在 Objective-C 和 Swift 中访问和使用此 Swift 扩展程序?
以前我在 Objective-C 中使用常量值,但现在我正在升级我的代码并想使用这个扩展。
Notification.Name
在 Objective-C 中不存在。 Objective-C 类型 NotificationName
实际上只是一个 NSString
。要在 Objective-C 中使用 Swift 内容,class 必须在两者中都可用,并且不能是 Swift 结构(如 Notification
或 String
, 说).
要为所欲为,那么,你需要有两个扩展:
- 一个用于 Swift
Notification.Name
,如您所愿;并且,
- 一个 Objective-C object(
NSString
,或者 NSNotification
,如果你愿意)。
1) 添加一个 Objective-C 兼容的 object 扩展到你的 Swift 文件:
public extension NSNotification {
public static let blahblahblah: NSString = "blahblahblah"
}
注意:在 Swift 4 中,properties must be computed 用于 Objective-C 兼容性。看起来像:
@objc public extension NSNotification {
public static var blahblahblah: NSString {
return "blahblahblah"
}
}
注意计算 属性 中的 var
:计算属性不能不可变,因此不能使用 let
。
2) 在 Objective-C 文件中,导入 Xcode 生成的 Swift header 文件(在任何其他导入下方):
#import "YourProjectName-Swift.h"
注意:将YourProjectName
替换为您项目的实际名称。因此,如果您的项目名为 "CoolGameApp",则 Swift header 将是 "CoolGameApp-Swift.h"。如果您的项目名称有空格,例如 "Cool Game App",请将它们替换为破折号:"Cool-Game-App-Swift.h"
3) 重建项目。
现在,您应该可以访问 Objective-C 中的扩展程序:
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
我在 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 的回答非常有帮助
除了这里的答案之外,我还必须在我的 Obj-C 代码可以看到它之前将 @objc 添加到我的 NSNotification 扩展中 (Swift 4)。
我为 Notification.Name
创建了如下扩展:
public extension Notification.Name {
public static let blahblahblah = Notification.Name(rawValue: "blahblahblah")
}
现在我想在 Objective-C 中使用此扩展程序,但即使 public.
也无法访问它如何在 Objective-C 和 Swift 中访问和使用此 Swift 扩展程序?
以前我在 Objective-C 中使用常量值,但现在我正在升级我的代码并想使用这个扩展。
Notification.Name
在 Objective-C 中不存在。 Objective-C 类型 NotificationName
实际上只是一个 NSString
。要在 Objective-C 中使用 Swift 内容,class 必须在两者中都可用,并且不能是 Swift 结构(如 Notification
或 String
, 说).
要为所欲为,那么,你需要有两个扩展:
- 一个用于 Swift
Notification.Name
,如您所愿;并且, - 一个 Objective-C object(
NSString
,或者NSNotification
,如果你愿意)。
1) 添加一个 Objective-C 兼容的 object 扩展到你的 Swift 文件:
public extension NSNotification {
public static let blahblahblah: NSString = "blahblahblah"
}
注意:在 Swift 4 中,properties must be computed 用于 Objective-C 兼容性。看起来像:
@objc public extension NSNotification {
public static var blahblahblah: NSString {
return "blahblahblah"
}
}
注意计算 属性 中的 var
:计算属性不能不可变,因此不能使用 let
。
2) 在 Objective-C 文件中,导入 Xcode 生成的 Swift header 文件(在任何其他导入下方):
#import "YourProjectName-Swift.h"
注意:将YourProjectName
替换为您项目的实际名称。因此,如果您的项目名为 "CoolGameApp",则 Swift header 将是 "CoolGameApp-Swift.h"。如果您的项目名称有空格,例如 "Cool Game App",请将它们替换为破折号:"Cool-Game-App-Swift.h"
3) 重建项目。
现在,您应该可以访问 Objective-C 中的扩展程序:
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
我在 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 的回答非常有帮助
除了这里的答案之外,我还必须在我的 Obj-C 代码可以看到它之前将 @objc 添加到我的 NSNotification 扩展中 (Swift 4)。