zoukankan      html  css  js  c++  java
  • Swift

    过去Swift要实现单例,无非是这三种方式:全局变量,内部变量和dispatch_once方式。但都略显繁琐。

    后来从1.2版本起,Swift中添加了如 static let 和 static var 这样的类变量的支持,这样单例的实现又简化了许多。

    下面提供两种比较好的单例写法。(要注意:不管哪种写法都要注意将init()方法私有化。因为在Swift中,所有对象的构造器默认都是 public,需要重写init让其成为私有的,防止其他对象使用这个类的默认的'()'初始化方法来创建对象。这里感谢网友nowIsFuture的提 醒。)

    方法1:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class AppManager {
        private static let _sharedInstance = AppManager()
         
        class func getSharedInstance() -> AppManager {
            return _sharedInstance
        }
         
        private init() {} // 私有化init方法
    }
     
    //使用方式
    AppManager.getSharedInstance()


    方法2:

    1
    2
    3
    4
    5
    6
    7
    8
    class AppManager {
        static let sharedInstance = AppManager()
         
        private init() {} // 私有化init方法
    }
     
    //使用方式
    AppManager.sharedInstance


    附:为什么需要保证INIT的私有化? 

    因为只有init()是私有的,才能防止其他对象通过默认构造函数直接创建这个类对象,确保你的单例是真正的独一无二。 
    因为在Swift中,所有对象的构造器默认都是public,所以需要重写你的init让其成为私有的。这样就保证像如下的代码编译报错,不能通过。

    1
    2
    var a1 = AppManager() //确保编译不通过
    var a2 = AppManager() //确保编译不通过
  • 相关阅读:
    Flash、Ajax各自的优缺点,在使用中如何取舍?
    纯CSS气泡框实现方法探究
    CSS里padding和margin的区别是什么?
    img图片标签alt和title属性的区别
    JS中都有哪些数据类型呢?
    剑指offer---按只字形顺序打印二叉树
    剑指offer---序列化二叉树
    剑指offer---二叉树的下一个结点
    剑指offer---二叉树的深度
    剑指offer---平衡二叉树
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4843695.html
Copyright © 2011-2022 走看看