objective-c - Swift中单例模式的写法理解
PHPz
PHPz 2017-04-28 09:04:48
0
3
590

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

PHPz
PHPz

学习是最好的投资!

全員に返信(3)
给我你的怀抱

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 でシングルトンを書くのはそれほど面倒なことではありません。以下の通り:

リーリー
いいねを押す +0
漂亮男人

sharedInstanceはクラスではなく、静的な計算プロパティです。このプロパティの型は、パラメータが0の静的メソッド

と考えることができます。

中括弧内の struct ...... return Static.instance! は、compute プロパティのコードです。インスタンスを作成する部分は、dispatch_once を使用して 1 回だけ実行されることが保証されています。

いいねを押す +0
PHPzhong

Swift シングルトンについては海外のブログが書いているので参考にしてください

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート