文档章节

Swift之单例模式

XBlock
 XBlock
发布于 2015/12/16 10:06
字数 421
阅读 61
收藏 0

参考

https://github.com/hpique/SwiftSingleton

https://developer.apple.com/swift/blog/?id=7

how should global variables work?

  • Restrict initializers of global variables to be simple constant expressions, as C does.
  • Allow any initializer, run as a static constructor at app load time, as C++ does.
  • Initialize lazily, run the initializer for a global the first time it is referenced, similar to Java.

The first approach was ruled out because Swift doesn’t need constant expressions like C does. In Swift, constants are generally implemented as (inlined) function calls. And there are good reasons to use complex initializers, e.g. to set up singletons or allocate a dictionary.

The second approach was ruled out because it is bad for the performance of large systems, as all of the initializers in all the files must run before the application starts up. This is also unpredictable, as the order of initialization in different files is unspecified.

Swift uses the third approach, which is the best of all worlds: it allows custom initializers, startup time in Swift scales cleanly with no global initializers to slow it down, and the order of execution is completely predictable.

The lazy initializer for a global variable (also for static members of structs and enums) is run the first time that global is accessed, and is launched as dispatch_once to make sure that the initialization is atomic. This enables a cool way to use dispatch_once in your code: just declare a global variable with an initializer and mark it private.

内容

类常量(Class Constant)

条件

支持Swift1.2以上的版本

例子

public class SingletonA {
    static let sharedInstance = SingletonA()
    
    private init() {
        print("init")
    }
    
    public func speak() -> String {
        return "hello!"
    }
}

print(SingletonA.sharedInstance.speak())

嵌套结构体(Nested Struct)

条件

支持Swift所有版本

例子

public class SingletonA {
    class var sharedInstance: SingletonA {
        struct Static {
            static let instance: SingletonA = SingletonA()
        }
        return Static.instance
    }
    
    private init() {
        print("init")
    }
    
    public func speak() -> String {
        return "hello!"
    }
}

dipatch_once

条件

例子

public class SingletonA {
    class var sharedInstance: SingletonA {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: SingletonA? = nil
        }
        dispatch_once(&Static.onceToken) { () -> Void in
            Static.instance = SingletonA()
        }
        return Static.instance!
    }
    
    private init() {
        print("init")
    }
    
    public func speak() -> String {
        return "hello!"
    }
}

全局变量(global variable)

条件

例子

private let instance = SingletonA()

public class SingletonA {
    class var sharedInstance: SingletonA {
        return instance;
    }
    
    private init() {
        print("init")
    }
    
    public func speak() -> String {
        return "hello!"
    }
}

© 著作权归作者所有

上一篇: iOS之CoreText 1
下一篇: 常用的软件
XBlock
粉丝 3
博文 92
码字总数 34281
作品 0
成都
程序员
私信 提问
设计模式(Swift) - 3.观察者模式、建造者模式

上一篇 设计模式(Swift) - 2.单例模式、备忘录模式和策略模式中讲了三种常见的设计模式. 单例模式: 限制了类的实例化,一个类只能实例化一个对象,所有对单例对象的引用都是指向了同一个对象....

Dariel
2018/07/01
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
4
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
5
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部