为什么我无法将字符串数据分配给 Swift 中的 nsuserdefaults?

Why I can't assign string data to my nsuserdefaults in Swift?

我调用了我的网络服务,它获取了 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!)

当你这样做时:

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
}

试试这个代码,它是安全的

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()

试试这个:

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)")
    }
}

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

不需要 "downcast" 使用 SwiftyJSON 的字典结果,它已经完成了!

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

您有一个结果为字符串的字段?使用 .string:

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

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

还有非可选的 getters,它们在 属性:

中添加了单词 "Value"
let username = json["id"].stringValue
defaults.setObject(username, forKey: "username")

但是警告!一个非可选的 getter 将假定该值在这里并强制解包,因此如果它为 nil,它将崩溃:json["id"].stringValuejson["id"].string! 相同。