美文网首页iOSswift带我飞2
swift实现单例的四种方式

swift实现单例的四种方式

作者: smalldu | 来源:发表于2015-10-11 10:33 被阅读15807次
单例模式

单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象。

当你只需要一个实例的时候需要使用单例,如UIApplication.sharedApplication() 等 ,windows的任务管理器,回收站 都是只能同时存在一个。

下面看看swift中的几种实现方式:

1、

import Foundation

class SingleOne {
    
    //单例
    static let shareSingleOne = SingleOne()
    
}

一句话搞定,静态常理。所有地方用到的都是同一个

2、

import Foundation

class SingleTwo {
    
    //单例
    class func shareSingleTwo()->SingleTwo{
        struct Singleton{
            static var onceToken : dispatch_once_t = 0
            static var single:SingleTwo?
        }
        dispatch_once(&Singleton.onceToken,{
            Singleton.single=shareSingleTwo()
        }
        )
        return Singleton.single!
    }
    
}

使用dispatch_once可以保证其中的代码只执行一次

3、

import Foundation

//全局的常量
let single = SingleThree()

class SingleThree {

    class var sharedInstance : SingleThree {
        return single
    }
}

4、

import Foundation

class SingleFour {
    
    static var sharedInstance : SingleFour {
        struct Static {
            static let instance : SingleFour = SingleFour()
        }
        return Static.instance
    }
}

在方法内定义静态常量

相关文章

网友评论

  • 国王or乞丐:你那边有用单利吧支付宝支付封装的么?跪求啊
  • WKCaesar:新的:static let `default` = ClassName()
  • FredYJH:第三种不是用static修饰一下比较好吗?static let single = NoteDAO()
  • fuadam1982:泛型类不支持static 怎么破
  • 巴图鲁:膜拜
  • Mangel:第二种方法的dispatch_once(&Singleton.onceToken,{
    Singleton.single=shareSingleTwo()
    }

    shareSingleTwo是不是应该改成SingleTwo
  • 小凡凡520:从安全性角度考虑 dispatch_once
    最合适不过
  • 爃少:为什么要用struct 来包着属性呢?不包着有什么影响?这个有点不懂 @南栀倾寒
    南栀倾寒:@hou_8 就是忘记dispatch_once
    hou_8:@南栀倾寒 oc式思想是什么呢 有没有什么时候用类 还是 结构体 的准则呢
    南栀倾寒:@爃少 典型的OC式思想 这样是不合理的
  • Joy___:http://download.csdn.net/detail/ramissue/8406493
    smalldu:@Martin_ 没关系慢慢啃
    Joy___:@大石头布 不过是英文的。最近打算开始看😊
    smalldu:@Martin_ thank you
  • Joy___:Swift 有一本Design pattern in swift 不知道有没有看过呢?
    smalldu:@Martin_ 没有 求连接
  • 南栀倾寒:final class SingleFour {

    static var sharedInstance : SingleFour {
    struct Static {
    static let instance : SingleFour = SingleFour()
    }
    return Static.instance
    }
    private init(){}
    }
    南栀倾寒:@laznrbfe 你随便声明一个变量 不用都会有这个警告
    laznrbfe:@南栀倾寒 我写代码的时候,把private init(){}去掉.原因:这样,SingleClass()就会有和苹果一样的警告“Result of initializer is unused”。
    这样操作会有什么隐患吗?
    加上private init(){},调用SingleClass()会直接报错,这个我晓得。
  • 南栀倾寒://全局的常量
    private let single = SingleThree()

    final class SingleThree {

    static var sharedInstance : SingleThree {
    return single
    }
    private init(){}
    }
    smalldu:@南栀倾寒 学习了。
  • 南栀倾寒:final class SingleTwo {

    //单例
    // 这里用static 换掉 Class
    static func shareSingleTwo()->SingleTwo{
    struct Singleton{
    static var onceToken : dispatch_once_t = 0
    static var single:SingleTwo?
    }
    dispatch_once(&Singleton.onceToken,{
    Singleton.single=shareSingleTwo()
    }
    )
    return Singleton.single!
    }
    private init(){}
    }
    smalldu:@南栀倾寒 :+1:
    南栀倾寒:@大石头布 class只能用在class类型 但是static 在结构体 class enum 都能用 区别就是 如果用在class类型里面 static = final class func
    smalldu:@南栀倾寒 static 和 class 都表示静态 有区别吗
  • 南栀倾寒:import Foundation

    final class SingleOne {

    //单例
    static let shareSingleOne = SingleOne()
    private init(){}
    }
    smalldu:@南栀倾寒 .赞,确实不能外界再初始化
  • 南栀倾寒:好多地方可以优化
    smalldu:@南栀倾寒 求优化

本文标题:swift实现单例的四种方式

本文链接:https://www.haomeiwen.com/subject/qttocttx.html