search

Home  >  Q&A  >  body text

objective-c - Swift中单例模式的写法理解

最近看很多开发的书籍和文章都用这样的一种写法:
阅读来源:http://www.cocoachina.com/swift/20151207/14584.html
书籍阅读来源:《iOS开发指南,从零基础到App Store上架第三版》中的10.4.1的例子
.....
这个是最近的文章

  1. 最丑陋方法(Swift皮,Objective-C心)

  2. 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:我是个初学者,对这些声明都比较熟悉,只是其中的逻辑结构不太理解,死循环。个人觉得如果纯粹记住这种写法(不确定是不是一种模板),不理解,都后面写程序中理解不透其中的逻辑结构,那就知其然不知其所以然。
暂时不理解这种逻辑关系,看网站上一大堆资料,貌似都没有好的解释。
求指导!

PHPzPHPz2762 days ago588

reply all(3)I'll reply

  • 给我你的怀抱

    给我你的怀抱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

    reply
    0
  • 漂亮男人

    漂亮男人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

    reply
    0
  • PHPz

    PHPz2017-04-28 09:06:48

    You can refer to what a foreign blog wrote about swift singletons

    reply
    0
  • Cancelreply