如何从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
要在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;
您需要执行以下操作:
#import "ProjectName-Swift.h"
)中的.m
,您要引用Swift类型。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代码来完成上述工作?
也许迟到了,但你也应该为共享实例添加@objc标记:
@objc
class VoiceShortcutsManager: NSObject {
@objc static let shared = VoiceShortcutsManager()
private override init() {
super.init()
updateVoiceShortcuts(nil)
}
...
}
这样您就可以安全地访问objective-c中的共享实例:
...
[VoiceShortcutsManager shared];
...
class MyClass {
private static let _sharedInstance = MyClass()
class func sharedInstance() -> MyClass { return _sharedInstance }
}
检索单身人士
MyClass.sharedInstance()