过去Swift要实现单例,无非是这三种方式:全局变量,内部变量和dispatch_once方式。但都略显繁琐。
后来从1.2版本起,Swift中添加了如 static let 和 static var 这样的类变量的支持,这样单例的实现又简化了许多。
下面提供两种比较好的单例写法。(要注意:不管哪种写法都要注意将init()方法私有化。因为在Swift中,所有对象的构造器默认都是
public,需要重写init让其成为私有的,防止其他对象使用这个类的默认的'()'初始化方法来创建对象。这里感谢网友nowIsFuture的提
醒。)
public,需要重写init让其成为私有的,防止其他对象使用这个类的默认的'()'初始化方法来创建对象。这里感谢网友nowIsFuture的提
醒。)
方法1:
1
2
3
4
5
6
7
8
9
10
11
12
|
class AppManager {
private static let _sharedInstance = AppManager ()
class func getSharedInstance() -> AppManager {
return _sharedInstance
}
private init () {} // 私有化init方法
} //使用方式 AppManager .getSharedInstance()
|
方法2:
1
2
3
4
5
6
7
8
|
class AppManager {
static let sharedInstance = AppManager ()
private init () {} // 私有化init方法
} //使用方式 AppManager .sharedInstance
|
附:为什么需要保证INIT的私有化?
因为只有init()是私有的,才能防止其他对象通过默认构造函数直接创建这个类对象,确保你的单例是真正的独一无二。
因为在Swift中,所有对象的构造器默认都是public,所以需要重写你的init让其成为私有的。这样就保证像如下的代码编译报错,不能通过。
1
2
|
var a1 = AppManager () //确保编译不通过
var a2 = AppManager () //确保编译不通过
|