如何在Objective-C类中分配Swift类中定义的静态对象?

问题描述 投票:0回答:4

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

脚步:

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

Swift Class声明:

从这[说明] [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
4个回答
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;

0
投票

您需要执行以下操作:

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

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


0
投票

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

@objc
class VoiceShortcutsManager: NSObject {
    @objc static let shared = VoiceShortcutsManager()

    private override init() {
        super.init()
        updateVoiceShortcuts(nil)
    }

...

}

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

...

[VoiceShortcutsManager shared];

...

-1
投票
 class MyClass { 
    private static let _sharedInstance = MyClass() 

    class func sharedInstance() -> MyClass { return _sharedInstance } 
} 

检索单身人士

MyClass.sharedInstance()
© www.soinside.com 2019 - 2024. All rights reserved.