为什么我不能将字符串数据分配给我在Swift中的nsuserdefaults?

时间:2016-03-13 07:57:44

标签: swift nsuserdefaults swifty-json

我有一个对我的webservice的调用,它获取3个字符串值,我想将它们存储好,所以我考虑使用nsuserdefaults。这是我的代码:

var username = json["id"]
var googleUserId = json["g_username"]
var facebookUserId = json["f_username"]

NSUserDefaults.standardUserDefaults().setObject(username, forKey: "username")
NSUserDefaults.standardUserDefaults().setObject(googleUserId, forKey: "googleUserId")
NSUserDefaults.standardUserDefaults().setObject(facebookUserId, forKey: "facebookUserId")


NSUserDefaults.standardUserDefaults().synchronize()

我得到的错误说:

Cannot convert value of type 'JSON' to expected argument type 'AnyObject?'

这里有什么问题?

====编辑

很抱歉之前没有提到 - json变量来自alamofire响应,这就是它在我的代码中的样子:

Alamofire.request(.POST, "http://mywebservice", parameters: par) .response { 
(request, response, data, error) in 
if(error == nil){
var json = JSON(data: data!)

4 个答案:

答案 0 :(得分:1)

执行此操作时:

var username = json["id"]

你没有得到一个字符串。你得到一个JSON对象。如果你知道它是一个字符串,那就投吧。

var username = json["id"] as! String

if let username = json["id"] as! String {
    // it is not nil
}
else {
    // it is nil
}

答案 1 :(得分:1)

您正在使用SwiftyJSON,因此您还应该使用SwiftyJSON的功能。 :)

没有必要"垂头丧气"使用SwiftyJSON的字典结果,它已经完成了!

每个SwiftyJSON对象都有可选的getter和非可选的getter。

你有一个字符串作为结果吗?使用.string

if let username = json["id"].string {
    defaults.setObject(username, forKey: "username")
}

对于整数,它将是.int,对于数组,它是.array等。

还有非选择性的吸气剂,它们有" Value"添加到酒店:

let username = json["id"].stringValue
defaults.setObject(username, forKey: "username")

但警告!非可选的getter将假设值在此处并强制解包,因此如果它为nil,则会崩溃:json["id"].stringValuejson["id"].string!相同。

答案 2 :(得分:0)

试试这段代码吧,它安全可靠

let defaults = NSUserDefaults.standardUserDefaults()

if let username = json["id"] as? String {
    defaults.setObject(username, forKey: "username")
}
if let googleUserId = json["g_username"] as? String {
    defaults.setObject(googleUserId, forKey: "googleUserId")
}
if let facebookUserId = json["f_username"] as? String {
    defaults.setObject(facebookUserId, forKey: "facebookUserId")
}

defaults.synchronize()

答案 3 :(得分:0)

试试这个:

Alamofire.request(.POST, "http://mywebservice", parameters: par).responseJSON {
    request, response, result in
    switch result {
    case .Success(let data):
        let json = JSON(data: data)
        // ...

    case .Failure(let data, let error):
        print("Request failed with error: \(error)")
    }
}