为什么我无法将字符串数据分配给 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"].stringValue
与 json["id"].string!
相同。
我调用了我的网络服务,它获取了 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"].stringValue
与 json["id"].string!
相同。