美文网首页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