从Objective-C调用Swift Singleton

Nic*_*als 15 singleton objective-c swift

我在从Objective-C访问Swift Singleton时遇到了一些麻烦.

@objc class SingletonTest: NSObject {

    // swiftSharedInstance is not accessible from ObjC
    class var swiftSharedInstance: SingletonTest {
    struct Singleton {
        static let instance = SingletonTest()
        }
        return Singleton.instance
    }        
}
Run Code Online (Sandbox Code Playgroud)

无法达到swiftSharedInstance.

roh*_*tel 21

Nicky Goethlis的回答是正确的,但我只想添加另一种Singleton创建的方式,称为 One line Singleton"在Swift中,我最近遇到过它并没有使用Struct:

Singleton.swift

@objc class Singleton: NSObject {

  static let _singletonInstance = Singleton()
  private override init() {
    //This prevents others from using the default '()' initializer for this class.
  }

  // the sharedInstance class method can be reached from ObjC. (From OP's answer.)
  class func sharedInstance() -> Singleton {
    return Singleton._singletonInstance
  }

  // Some testing
  func testTheSingleton() -> String {
    return "Hello World"
  }
}
Run Code Online (Sandbox Code Playgroud)

SomeObjCFile.m

Singleton *singleton = [Singleton sharedInstance];
NSString *testing = [singleton testTheSingleton];
NSLog(@"Testing---> %@",testing);
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 4.1中,您甚至不需要sharedInstance()方法.您可以使用@objc注释静态'singletonInstance',并直接从ObjC代码访问该属性.(这可能早于4.1开始;今天只是玩弄它.) (5认同)

Suh*_*til 8

Swift 5 及以上

final class Singleton: NSObject {

    @objc static let shared = Singleton()

    @objc var string: String = "Hello World"

    private override init() {}   
}
Run Code Online (Sandbox Code Playgroud)

用于 Objective-C

NSLog("Singleton String = %@", [Singleton shared].string]);
Run Code Online (Sandbox Code Playgroud)


Nic*_*als 7

现在我有以下解决方案.也许我忽视了一些能让我直接访问"swiftSharedInstance"的东西?

@objc class SingletonTest: NSObject {

    // swiftSharedInstance is not accessible from ObjC
    class var swiftSharedInstance: SingletonTest {
    struct Singleton {
        static let instance = SingletonTest()
        }
        return Singleton.instance
    }

    // the sharedInstance class method can be reached from ObjC
    class func sharedInstance() -> SingletonTest {
        return SingletonTest.swiftSharedInstance
    }

    // Some testing
    func testTheSingleton() -> String {
        return "Hello World"
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在ObjC中我可以获取sharedInstance类方法(在导入xcode后生成swift头绑定)

SingletonTest *aTest = [SingletonTest sharedInstance];
NSLog(@"Singleton says: %@", [aTest testTheSingleton]);
Run Code Online (Sandbox Code Playgroud)

  • 尝试在类变量声明前添加`@objc`,看看它给你带来了什么错误. (2认同)