【问题标题】:How to allocate static object defined in a Swift class inside an objective-C class?如何在 Objective-C 类中分配 Swift 类中定义的静态对象?
【发布时间】:2016-10-12 08:24:51
【问题描述】:

如何从我的 Objective-C 类访问在我的 Swift 文件中声明的“SharedManager”的共享实例?

步骤:

我在 Swift 文件中声明了一个对象,如下所示:

Swift 类声明:

从这个 [说明][1] 我做到了:

// Swift class
class SharedManager{
    static let sharedInstance = SharedManager()
}

来自 Objective-C 类:

在 AppDelegate.m 中:

#import "ProjectName-Swift.h"

@class SharedManager;
@interface AppDelegate ()
@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// How do I access to the shared instance of "SharedManager" ?

}    

  [1]: http://stackoverflow.com/questions/24024549/using-a-dispatch-once-singleton-model-in-swift

【问题讨论】:

    标签: ios objective-c swift forward-declaration language-interoperability


    【解决方案1】:

    要在 Objective C 中使用 Swift 类,它必须继承自 Objective C 类(例如 NSObject),或者用@objc 标记。

    要么:

    @objc class SharedManager {
        static let sharedInstance = SharedManager()
    }
    

    或者:

    class SharedManager: NSObject {
        static let sharedInstance = SharedManager()
    }
    

    然后你可以像使用任何其他 Objective C 类一样使用它:

    SharedManager *manager = SharedManager.sharedInstance;
    

    【讨论】:

    • 这是什么意思?有什么问题?
    • 它说找不到属性共享实例
    • 我认为你必须让sharedInstance public
    • @mm24: SharedManager 必须从 NSObject 继承才能在 Objective-C 中使用。
    • @mm24 哦,是的,它必须要么继承自 Objective C 类,要么使用 @objc 注释
    【解决方案2】:

    可能迟到了,但您也应该为共享实例添加 @objc 标记:

    @objc
    class VoiceShortcutsManager: NSObject {
        @objc static let shared = VoiceShortcutsManager()
    
        private override init() {
            super.init()
            updateVoiceShortcuts(nil)
        }
    
    ...
    
    }
    

    这样你就可以安全地访问objective-c中的共享实例了:

    ...
    
    [VoiceShortcutsManager shared];
    
    ...
    

    【讨论】:

      【解决方案3】:

      您需要执行以下操作:

      1. #import "ProjectName-Swift.h" 在 Objective-C 实现文件 (.m) 中,您要在其中引用 Swift 类型。
      2. NSObject 继承您的SharedManager
      class SharedManager: NSObject {
          static let sharedInstance = SharedManager()
      }
      

      这至少适用于 Swift 2.3 和 3(即 Xcode 8 和当前 macOS / iOS SDK 版本,在构建配置中是否启用“使用旧版 Swift 语言版本”)。我不记得在 Swift 2.3 之前是否可以通过使用 @objc 属性另外标记类来完成上述工作,或者在 Swift 中声明的静态变量是否对 Objective-C 代码完全不可用?

      【讨论】:

        【解决方案4】:
         class MyClass { 
            private static let _sharedInstance = MyClass() 
        
            class func sharedInstance() -> MyClass { return _sharedInstance } 
        } 
        

        通过

        检索单例
        MyClass.sharedInstance()
        

        【讨论】:

        • 桥接头文件用于将 Objective C 暴露给 Swift,这与 OP 需要的相反。 OP 需要使用 Xcode 创建的自动生成的头文件,他们已经导入了(#import ProjectName-Swift.h)。
        • 正如亚历山大所说,我有桥头来导出 Swift 类
        • class MyClass { private static let _sharedInstance = MyClass() class func sharedInstance() -> MyClass { return _sharedInstance } } 通过 MyClass.sharedInstance() 检索单例
        • 嗨,Bassam,添加方法有效。您能否编辑您的答案以反映这一点,然后我会接受它?
        猜你喜欢
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多