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

最近看很多开发的书籍和文章都用这样的一种写法:
阅读来源: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

学习是最好的投资!

répondre à tous(3)
给我你的怀抱

Le mot-clé

class ne définit pas ici une classe imbriquée, mais indique que sharedInstance est un attribut de classe. Bien sûr, shareInstance n'est pas à proprement parler le computed property (attribut calculé) mentionné ci-dessus. mais un get-only property (attribut en lecture seule). Un getter est défini à l'intérieur du struct (méthode qui renvoie des attributs) de cet attribut en lecture seule. Il y a deux attributs statiques à l'intérieur de ce struct. Vous pouvez dire à partir du nom que onceToken est une balise. dispatch_once Lorsqu'elle est utilisée, dispatch_once est une fonction utilisée pour exécuter des méthodes ponctuelles dans GCD. Il vous suffit de comprendre que la fermeture passée dans dispatch_once ne sera exécutée qu'une seule fois. Dans cet exemple, il n'y a qu'une seule phrase. en conclusion, c'est tout Static.instance = TheOneAndOnlyKraken(). Cette phrase initialise une instance de TheOneAndOnlyKraken, puis attribue cette instance à l'attribut statique Static dans la structure instance, et renvoie enfin Static.instance!, c'est-à-dire qu'une instance de TheOneAndOnlyKraken est renvoyée. la raison est que Static.instance = TheOneAndOnlyKraken() cette instruction ne sera exécutée qu'une seule fois et renverra directement l'instance générée dans le futur, afin qu'un singleton puisse être garanti. Est-ce clair ?

Mais pour être honnête, écrire des singletons dans Swift ne doit pas être si compliqué du tout. Comme suit :

private let instance = SomeClass()
class SomeClass {
    public class var singleInstance: SomeClass {
        return instance
    }
}

//获取单例
let someClass = SomeClass.singleInstance
漂亮男人

sharedInstance n'est pas une classe, mais une propriété calculée statique. Le type de cette propriété est TheOneAndOnlyKraken. >

Le

entre accolades est le code de la propriété de calcul. La partie qui crée l'instance est garantie d'être exécutée une seule fois avec dispatch_oncestruct ...... return Static.instance!.

PHPzhong

Vous pouvez vous référer à ce qu'un blog étranger a écrit sur les singletons rapides

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal