2015-10-18 47 views
-1

我知道这“一线单”的方式苹果斯威夫特辛格尔顿实施

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

但如果你将寻找到标准的单一对象像UIApplication你会看到:

enter image description here

我我很好奇苹果公司用来创建单件的代码。

+1

你看到的仅仅是公共接口,它不允许苹果如何实现该方法的结论。实现不是开源的,所以除非苹果工程师决定在这里揭示它,否则我们无法回答你的问题。 –

回答

0

苹果官样介绍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的 “单身” 部分中找到。

+0

我的问题不是“如何创建singletone”,而是关于苹果如何在代码中实现单例。 –

+1

感谢downvote Andrei!如果苹果公开发布他们的风格指南,你可以相信这是他们告诉他们的工程师在内部执行代码的方式。或者你想看看在操作系统中如何完成单例的实际源代码?我不相信iOS或MacOS的任何部分都是在Swift中完成的。 –

+0

没有冒犯,但是这看起来好像有人问一些关于饮食的具体问题,而你回答像“只是少吃”)) –

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() { 

    } 
} 
2

@迈克尔Dautermann的答案是正确的,如果你正在寻找苹果的建议,就如何在斯威夫特写单身。

但是,如果您想知道为什么来自Cocoa Touch的singleton看起来像他们所做的那样,答案很简单。它们不是用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; 
} 

所以这可能是真的,他们建议的书面单的不同方式斯威夫特,但是你看的是一个Objective-C单桥斯威夫特。

+0

我知道这是创建单例的正确方法,但问题是不同的。关于桥接btw的好处。 –

0

苹果如何实现单身人士可以在他们的博客here中阅读。

懒初始化的全局变量(也为 结构和枚举静态成员)在第一次运行时,全球访问,并 被推出,dispatch_once确保初始化是 原子。这使得在你的代码中使用dispatch_once很酷的方式: 只是用一个初始化程序声明一个全局变量,并将其标记为 私有。

所以基本上他们仍然使用dispatch_once调用,就像在Objective-C时代一样,但现在它由Swift编译器在幕后处理。