Swift学习-单例

原创 2015年11月20日 10:38:06

       Swift中的单例定义个人感觉和Objective-C的单例有所不同,在之前,Objective-C的单例首先是定义一个static的类对象,然后通过GCD来确保只执行一次,但是在Swift的类中不允许有static的成员变量,虽然类中不允许有static的成员变量,但是结构体中是可以的有static的成员变量的,所以首先以Student类为实例:


首先定义个一个结构体

    //定义一个名字叫做Inner的结构体
    struct Inner{
        static var m:Student?;//?表示 可能不存在
        static var token:dispatch_once_t = 0;//默认为0,可以按住option点进去看一下开发文档,解释如下
        /*!
        * @typedef dispatch_once_t
        *
        * @abstract
        * A predicate for use with dispatch_once(). It must be initialized to zero.//一个谓词,必须为0
        * Note: static and global variables default to zero.//static(静态)和全局默认为0

        public typealias dispatch_once_t = Int
        */
    }

接下来的单例方法就和之前很像了,只不过Swift中没有Block代码块的概念,但是有闭包的概念,所以定义如下

    //单例
    static func shareInstance() -> Student
    {

        //与objc的一样,确保只执行一次
        dispatch_once(&Inner.token) { () -> Void in
          
            Inner.m = student();
        }
        
        return Inner.m!;
    }


如果觉得上面这么写麻烦,当然也有很简单的写法,如下:

class Student
{
    static private var onceToken : dispatch_once_t = 0
    static private var shareObject : Student?
    
    class func shareInstance() -> Student {
        
        dispatch_once(&onceToken) { 
            
            shareObject = Student()
        }
        
        return shareObject!
    }
}


用代码进行测试,如下

//获取两个单例对象(实际指向同一块内存)
var student1:Student = Student.shareInstance();
var student2:Student = Student.shareInstance();

//定义第一个单例对象的name
student1.name = "RunIntoLove";

print("student1.name = \(student1.name)");
print("student2.name = \(student2.name)");

//定义第二个单例对象的name
student2.name = "RunIntoLove----------";

print("student1.name = \(student1.name)");
print("student2.name = \(student2.name)");


测试结果如下,依旧实现了单例的形式

student1.name = Optional("RunIntoLove")
student2.name = Optional("RunIntoLove")
student1.name = Optional("RunIntoLove----------")
student2.name = Optional("RunIntoLove----------")
Program ended with exit code: 0




版权声明:本文为博主原创文章,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

Swift学习之每日一tip (6) 单例

近日,在翻看以前写过的一些OC应用的时候,看到了OC的单例,然后暮然想要试着写一写Swift下的单例,于是,在经过一番波折后,终于将Swift下的单例写了出来。 OC下的单例实现栗子: + (inst...

单例在Swift中的正确实现方式

单例在Swift中的正确实现方式 原文链接 : The Right Way to Write a Singleton原文作者 : Hector Matos译文出自 : 开发技术前...

swift 单例的简单总结

  • 2016年08月15日 10:34
  • 22KB
  • 下载

Swift中闭包,懒加载,单例的写法区别

Swift中闭包,懒加载,单例的写法区别
  • cuin123
  • cuin123
  • 2015年12月06日 23:19
  • 270

swift2.0单例写法【转】

往事回忆之ObjC单例 Swift是Objective-C的一种自然演变,它用如下的方式实现单例: @interface Kraken : NSObject @end @implem...

Swift中编写单例的正确方式

转自:http://www.cocoachina.com/swift/20151207/14584.html 如有侵犯,请来信oiken@qq.com 在之前的帖子里聊过状态管理有...
  • oiken
  • oiken
  • 2016年07月02日 14:44
  • 1259

Swift 单例

单例 由 王巍 (@ONEVCAT) 发布于 2014-11-05 在 Swift 1.2 后,我们可以使用类变量了,所以 Swift 中的单例也有了比较理想的创建方式,参见本节最...

Swift百万线程攻破单例(Singleton)模式

在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton {       class var shared: Sw...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift学习-单例
举报原因:
原因补充:

(最多只允许输入30个字)