最近看很多开发的书籍和文章都用这样的一种写法:
阅读来源: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()
This statement will only be executed once, and it will directly return the generated instance in the future, so a singleton can be guaranteed. Is this clear?
But to be honest, writing singletons in Swift doesn’t have to be so troublesome at all. As follows:
private let instance = SomeClass()
class SomeClass {
public class var singleInstance: SomeClass {
return instance
}
}
//获取单例
let someClass = SomeClass.singleInstance
漂亮男人2017-04-28 09:06:48
sharedInstance is not a class, but a static computed property. The type of this property is TheOneAndOnlyKraken. You can think of it as a static method with 0 parameters
The struct ...... return Static.instance!
inside the curly brackets is the code for the compute property. The part that creates the instance is guaranteed to be executed only once using dispatch_once