如何从swift singleton init抛出错误/异常

时间:2016-05-24 09:56:18

标签: ios swift swift2

在我的自定义swift框架中,我有一个最终用户将使用的单例类。如果在初始化期间出现任何问题,单例init()会做很多工作,我想抛出错误。

mySingleton.swift

public class mySingleton: NSObject {
    .......
    public static let sharedInstance = mySingleton(singleton : true)
    ....
}

private override convenience init() {
    assertionFailure( "Please use sharedInstance" )
    self.init(singleton : false)
}

private init(singleton: true) {
    super.init()

    //Other class objects init() etc.

   //Some other processing etc.

}

框架用户:

//Initialise framework
mySingleton.sharedInstance

在mySingleTon init过程中向最终用户抛出错误/异常的最佳方法是什么。

3 个答案:

答案 0 :(得分:0)

<强>已更新

具有隐式展开值的变体:

public class MySingleton: NSObject {

    private static var _sharedInstance: MySingleton!

    public static var sharedInstance: MySingleton! {

        if _sharedInstance == nil {

            let instance = MySingleton()

            if let error = instance.initializationError {

                //log an error
                print("An error occured during singleton object instantiation: \(error)")
                return nil
            }

            _sharedInstance = instance
        }

        return _sharedInstance
    }

    var initializationError: ErrorType?

    private override init() {

        super.init()

        //Other class objects init() etc.

        //Some other processing etc.

        do {
            try initialize()
        } catch {
            initializationError = error
        }
    }

    private func initialize() throws {

        throw NSError(domain: "my.error", code: -1, userInfo: nil)
    }
}

答案 1 :(得分:0)

如果您想抛出错误或使init失败与某些条件有关,请使用可用的初始化程序

struct Animal {
    let species: String
    init?(species: String) {
    if species.isEmpty { return nil }
      self.species = species
    }
}

希望这应该有所帮助

答案 2 :(得分:0)

你应该真的,真的想想你的意图在这里。

单例创建一次,并为应用程序的其余部分保持活动状态。如果创建单例失败,您的应用程序将执行什么操作?我使用单身人士的地方,必须成功。如果他们不这样做,我的应用程序无法运行。

如果创建单例失败,那么最好是产生一个会杀死应用程序的断言。另一方面,在许多有问题的情况下(例如,缺少网络连接),单个的创建不应该失败