如何在 swift 语言的 SingleTon class 中设置 NSDictionary

How to set NSDictionary in SingleTon class in swift language

我是 swift 语言的新手。我想将来自字典的登录响应存储在单例 class 中。每当我需要该数据时,我想在单例 class 中从字典中重用它。请找出我的错误。在此附上我的示例代码。

我的单身狗Class

class MarblesSingleton: NSObject { 
    class var sharedInstance:MarblesSingleton
    {
        struct Singleton
        {
            static let instance = MarblesSingleton()
        }
        return Singleton.instance
    }
    var provisionalDataDict:NSDictionary!
    override init() {        
        super.init()
        self.provisionalDataDict = nil
    } 
}
let singletonClass = MarblesSingleton()

登录后,我像这样 class 在单例中添加了对字典的响应,

singletonClass.provisionalDataDict = jsonData

在另一个 class 中,我想像这样使用来自单例 class 的数据,

m_CountryTextField.text = NSString(format: "%@", singletonClass.provisionalDataDict.valueForKey("country") as NSString)

我的问题是:我因致命错误而崩溃。

fatal error: unexpectedly found nil while unwrapping an Optional value

首先你应该按照tkanzakic写的那样使用单例。然后你必须检查你的字典是否有效:

if var unwrapped_Dic = singletonClass.provisionalDataDict {
   m_CountryTextField.text = unwrapped_Dic.valueForKey("country") as NSString
}

如果你使用可选项,你总是应该检查强制解包是否成功。

我会这样做:

class DataManager {

    struct Static {
        static var token : dispatch_once_t = 0
        static var instance : DataManager?
    }

    class var instance: DataManager {
        dispatch_once(&Static.token) {  Static.instance = DataManager() }
        return Static.instance!
    }

    init(){
        assert(Static.instance == nil, "Singleton already initialized!")
    }

var userId = "defaultId"
var password = "defaultPassword"

}

以后您可以通过 DataManager.Instance.userId 访问它们 或设置为其他值 DataManager.Instance.userId = "newUserId"

如果你真的需要,你也可以在单例中创建一个字典变量 class。

希望有所帮助!