值有时 returns 作为带有 SwiftyJSON 的可选字符串
Value sometimes returns as optional string with SwiftyJSON
我想知道为什么 SwiftyJSON 有时 return 的值是 "myString" 而有时又是 Optional("myString")
例如:
func getFBUserData(){
if((FBSDKAccessToken.currentAccessToken()) != nil){
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
if (error == nil){
let fbJson = JSON(result)
let fbId = fbJson["id"].string
print(fbId)
}
})
}
}
此处 fbId 将 return: 可选("myString")
下一个:
static func loginWithEmail(facebookId: String, email: String, username: String, response: (token: String?) -> ()) {
let urlString = baseURL + ResourcePath.FbLogin.description
let parameters: [String: AnyObject] = [
"fb_id": facebookId,
"level": 1,
"email": email,
"username": username
]
Alamofire.request(.POST, urlString, parameters: parameters).responseJSON{ (responseData) -> Void in
//print(responseData)
let json = JSON(responseData.result.value!)
let token = json["api_token"].string
response(token: token)
}
}
此处token将return"myString"
那么当两个函数都使用 ".string" 而不是 ".string!"[= 时,一个函数 return optional() 怎么可能呢? 33=]?
那是因为你在做这个 let fbJson = JSON(result)
而不是 让 fbJson = JSON(结果!)
!
很危险,尤其是当您不知道它是否 optional.Just 时,请这样做:
func getFBUserData(){
if((FBSDKAccessToken.currentAccessToken()) != nil){
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
if (error == nil){
let fbJson = JSON(result)
if let fbId = fbJson["id"].string {
print(fbId)
}
}
})
}
}
SwiftyJSON 有两种 "getters" 用于检索值:可选和非可选。
.string
是 optional getter 表示一个值的字符串,所以你必须在使用前解包
if let fbId = fbJson["id"].string {
print(fbId)
}
否则字符串本身将包含术语 "Optional"。
如果您 100% 确定 总会有一个值,您可以通过使用非可选 getter 你不再需要 if let
:
let fbId = fbJson["id"].stringValue
但要小心,因为如果值为 nil,这将崩溃,就像你用 fbJson["id"].string!
强制解包一样(你永远不应该这样做)。
请注意,SwiftyJSON 对其他类型的工作方式相同:.int
与 .intValue
、.array
与 .arrayValue
等
我想知道为什么 SwiftyJSON 有时 return 的值是 "myString" 而有时又是 Optional("myString")
例如:
func getFBUserData(){
if((FBSDKAccessToken.currentAccessToken()) != nil){
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
if (error == nil){
let fbJson = JSON(result)
let fbId = fbJson["id"].string
print(fbId)
}
})
}
}
此处 fbId 将 return: 可选("myString")
下一个:
static func loginWithEmail(facebookId: String, email: String, username: String, response: (token: String?) -> ()) {
let urlString = baseURL + ResourcePath.FbLogin.description
let parameters: [String: AnyObject] = [
"fb_id": facebookId,
"level": 1,
"email": email,
"username": username
]
Alamofire.request(.POST, urlString, parameters: parameters).responseJSON{ (responseData) -> Void in
//print(responseData)
let json = JSON(responseData.result.value!)
let token = json["api_token"].string
response(token: token)
}
}
此处token将return"myString"
那么当两个函数都使用 ".string" 而不是 ".string!"[= 时,一个函数 return optional() 怎么可能呢? 33=]?
那是因为你在做这个 let fbJson = JSON(result) 而不是 让 fbJson = JSON(结果!)
!
很危险,尤其是当您不知道它是否 optional.Just 时,请这样做:
func getFBUserData(){
if((FBSDKAccessToken.currentAccessToken()) != nil){
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
if (error == nil){
let fbJson = JSON(result)
if let fbId = fbJson["id"].string {
print(fbId)
}
}
})
}
}
SwiftyJSON 有两种 "getters" 用于检索值:可选和非可选。
.string
是 optional getter 表示一个值的字符串,所以你必须在使用前解包
if let fbId = fbJson["id"].string {
print(fbId)
}
否则字符串本身将包含术语 "Optional"。
如果您 100% 确定 总会有一个值,您可以通过使用非可选 getter 你不再需要 if let
:
let fbId = fbJson["id"].stringValue
但要小心,因为如果值为 nil,这将崩溃,就像你用 fbJson["id"].string!
强制解包一样(你永远不应该这样做)。
请注意,SwiftyJSON 对其他类型的工作方式相同:.int
与 .intValue
、.array
与 .arrayValue
等