最近看很多開發的書籍和文章都用這樣的一種寫法:
閱讀來源:http://www.cocoachina.com/swift/20151207/14584.html
書籍閱讀來源:《iOS開髮指南,從零基礎到App Store上架第三版》中的10.4.1的例子
.....
這個是最近的文章
最醜方法(Swift皮,Objective-C心)
TheOneAndOnlyKraken {
class var sharedInstance: TheOneAndOnlyKraken {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: TheOneAndOnlyKraken? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = TheOneAndOnlyKraken()
}
return Static.instance!
}
}
關於這種的寫法,我思考了很久(也有一周以上,也有看其他資料,還是沒理解透徹)
我主要不理解的一個邏輯關係是:
(類中聲明類並創建內部類。應該是這樣,有點繞)
1、在定義的TheOneAndOnlyKraken類中再定義一個TheOneAndOnlyKraken類型的sharedInstance類,這種嵌套,如果創建了一個sharedInstance,那這個sharedInstance和TheOneAndOnlyKraken的邏輯關係該怎麼理解比較通俗易懂?有點死循環的感覺。
2、在sharedInstance類別中定義了一個Static結構體,這個結構體中宣告了一個TheOneAndOnlyKraken類型的變數instance。最後回傳了這個instance變數。這instance和定義的兩個類別之間的邏輯關係又是如何理解比較簡單易懂。
PS:我是個初學者,對這些聲明都比較熟悉,只是其中的邏輯結構不太理解,死循環。個人覺得如果純粹記住這種寫法(不確定是不是一種模板),不理解,都後面寫程式中理解不透其中的邏輯結構,那就知其然不知其所以然。
暫時不理解這種邏輯關係,看網站上一大堆資料,似乎都沒有好的解釋。
求指導!
给我你的怀抱2017-04-28 09:06:48
class
这个关键字在这里不是定义一个嵌套类,而是表明sharedInstance
是一个类属性,当然shareInstance
严格来说也不算楼上所说的computed property
(计算属性),而是一个get-only property
(只读属性)。在这个只读属性的getter
(返回属性的方法)内部定义了一个struct
,这个struct
内部有两个静态属性,onceToken
呢看名字就知道是一个标记,调用dispatch_once
的时候要用,dispatch_once
是GCD中用来执行一次性方法的函数,你只要理解为传入dispatch_once
中的闭包只会执行一次就行了,本例中闭包内只有一句话,就是Static.instance = TheOneAndOnlyKraken()
。这句话初始化了一个TheOneAndOnlyKraken
实例,然后把这个实例赋值给Static
这个结构体中的静态属性instance
,最后把Static.instance!
返回,也就是返回了TheOneAndOnlyKraken
的一个实例,关键就在于Static.instance = TheOneAndOnlyKraken()
這條語句只會執行一次,以後就直接回傳已經產生的那個實例了,所以可以保證單例。這樣說明白麼?
不過說實話,在Swift中寫單例完全不用這麼麻煩。如下即可:
private let instance = SomeClass()
class SomeClass {
public class var singleInstance: SomeClass {
return instance
}
}
//获取单例
let someClass = SomeClass.singleInstance
漂亮男人2017-04-28 09:06:48
sharedInstance不是一個類別, 而是一個靜態的computed property, 這個property的類型是TheOneAndOnlyKraken. 你可以把他想成一個..0個參數的靜態方法
花括號內的struct ...... return Static.instance!
是compute這個property的程式碼, 其中創建instance的部分用dispatch_once保證只執行一次