代码之家  ›  专栏  ›  技术社区  ›  BARS

如何使用通知。名称从Swift扩展到Objective-C?

  •  32
  • BARS  · 技术社区  · 7 年前

    我为创建了扩展 Notification.Name 如下所示:

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

    现在我想在Objective-C中使用这个扩展,但即使它是公共的,也无法访问。

    如何在Objective-C和Swift中访问和使用此Swift扩展?

    以前我在Objective-C中使用常量值,但现在我正在升级代码并希望使用此扩展。

    3 回复  |  直到 3 年前
        1
  •  63
  •   Warif Akhand Rishi    6 年前

    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的回答非常有帮助

        2
  •  24
  •   Darkwonder    5 年前

    Notification.Name 在Objective-C和Objective-C类型中不存在 NotificationName 真的只是一个 NSString . 要在Objective-C中使用Swift stuff,类必须在两者中都可用,并且不能是Swift结构(如 Notification String

    要想做你想做的事,你需要有两个扩展:

    • 一个给Swift 通知。名称 ,正如您所做的那样;和
    • NSString字符串 ,比如说,或者 NSNotification 如果您愿意)。

    1) 将Objective-C兼容的对象扩展名添加到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头文件(在任何其他导入下面):

    #import "YourProjectName-Swift.h"
    

    注意:更换 YourProjectName 与您的项目的实际名称。因此,如果您的项目名为“CoolGameApp”,Swift标题将为“CoolGameApp Swift.h”。如果项目名称中有空格,如“酷炫游戏应用”,请将其替换为破折号:“酷炫游戏应用Swift.h”

    3) 重建项目。

    现在,您应该能够访问Objective-C中的扩展:

    [[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
    
        3
  •  5
  •   janineanne    6 年前

    除了这里的答案之外,我必须在我的Obj-C代码能够看到它之前,将@objc添加到我的NSNotification扩展中(Swift 4)。