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 单例传值及其使用方式

//声明一个单例 SwiftSingleton.swift import UIKit class SwiftSingleton: NSObject {      /...
  • WUYANYANstrong
  • WUYANYANstrong
  • 2016年09月23日 14:29
  • 308

swift单例的创建与使用

class ISHelp: NSObject { internal static let instance = ISHelp() //必须保证init方法的私有性,只有这样,才能保证单...
  • delicious_d
  • delicious_d
  • 2016年06月15日 17:28
  • 2362

ios-Swift中的单例写法

因为静态去的对象只能去设置一次数值,所以我们可以用静态常量来创建一个对象,从而得到单例的效果,如下代码所示 static let tool = SoundTools()在Swift中单例的写法和懒加...
  • ZCMUCZX
  • ZCMUCZX
  • 2017年09月17日 19:43
  • 168

swift 单例模式正确写法

class zuoManger: NSObject {                   static let sharedInstance = zuoManger()         ...
  • zuojinmin
  • zuojinmin
  • 2016年02月04日 17:02
  • 550

Swift3 单例模式

常见的有这么几种方法 第一种简单到爆的 final class Single: NSObject { static let shared = Single() private over...
  • youshaoduo
  • youshaoduo
  • 2016年11月16日 12:44
  • 11143

Swift 单例模式实现及类方法

在开始单例模式之前我们先讲一下类方法。应为单例模式需要依靠类方法来实现 首先,我们知道类方法就是 直接使用类名来调用,无需生成对象,再去调用。 其实类方法的生成很简单,只需要给我们之前的对象方法用...
  • lwjok2007
  • lwjok2007
  • 2015年08月27日 11:01
  • 1435

Swift单例模式详解-线程安全,多核性能

class Singleton {     class var sharedInstance : Singleton {  ... 解释: 1 在类hwcSingleton 中,用class关键字...
  • Hello_Hwc
  • Hello_Hwc
  • 2014年10月16日 19:57
  • 2525

Swift实现OC中的单例模式

一、MySingle类 import Foundation class MySingle{ //定义单例的属性 var name:String? var age:Int? ...
  • Chuanfeng_liu
  • Chuanfeng_liu
  • 2014年06月11日 14:35
  • 1075

Swift的GCD详解

swift GCD
  • watertekhqx
  • watertekhqx
  • 2017年03月13日 16:57
  • 229

OC和Swift中的简单的单例

OC 和 Swift 中的简单单例的创建方式...
  • IM_Loser
  • IM_Loser
  • 2017年01月24日 18:06
  • 271
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift学习-单例
举报原因:
原因补充:

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