Apple Swift Singleton实现

时间:2015-10-18 12:25:15

标签: ios swift singleton

我知道“一线单身”方法

final class Singleton {
    static let sharedInstance = Singleton()
    private init() {}
}

但是如果你要研究像UIApplication这样的标准单例对象,你会看到:

enter image description here

我很好奇Apple用来创建单例的代码。

3 个答案:

答案 0 :(得分:2)

如果您正在寻找Apple关于如何在Swift中编写单身人士的建议,那么@Michael Dautermann的回答是正确的。

但是,如果你想知道为什么来自Cocoa Touch的单身人士看起来像他们一样,答案很简单。它们不是用Swift编写的,它们是用Objective-C编写的,而在Objective-C中,单例通常用类方法编写。通常是这样的。

+ (UIApplication * _Nonnull)sharedApplication
{  
    // This is a typical example of how one might to this in Objective-C
    // but we have no way of knowing what code Apple actually has here. 
    // All we know is that there is a sharedApplication class method.
    static UIApplication *sharedApplication = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        sharedApplication = [[UIApplication alloc] init];
    });

    return sharedApplication;
}

因此,他们推荐在Swift中编写单例的不同方法可能是正确的,但您正在寻找的是与Swift桥接的Objective-C单例。

答案 1 :(得分:0)

Apple的官方示例将Swift中的Singleton设置描述为:

class Singleton {
    static let sharedInstance = Singleton()
}

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()
        // setup code
        return instance
    }()
}

您可以在"Adopting Cocoa Design Patterns" in their Swift documentation的“Singleton”部分找到。

答案 2 :(得分:0)

这个怎么样?

class Singleton {

    class func sharedInstance() -> Singleton {
        struct Static {
            static var instance: Singleton? = nil
            static var onceToken: dispatch_once_t = 0
        }

        dispatch_once(&Static.onceToken) {
            Static.instance = self()
        }

        return Static.instance!
    }

    @required init() {

    }
}