我想知道为什么SwiftyJSON有时会将值返回为“myString”,而其他时间则返回可选(“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 将返回:可选(“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)
}
}
此处令牌将返回“myString”
那么当两个函数都使用“。string”而不是“时,一个函数如何返回optional()。string!”?
答案 0 :(得分:4)
SwiftyJSON有两种" getters"用于检索值:可选和非可选。
.string
是值的字符串表示的可选 getter,因此您必须在使用前将其解包
if let fbId = fbJson["id"].string {
print(fbId)
}
否则字符串本身将包含术语"可选"。
如果您<100>确定总会有值,则可以使用等效的&#34;强制解包&#34;通过使用非可选的getter,您不再需要if let
:
let fbId = fbJson["id"].stringValue
但要注意,因为如果值为nil,这将会崩溃,就像你用fbJson["id"].string!
强行解包一样(你永远不应该这样做)。
请注意,SwiftyJSON对其他类型的工作原理相同:.int
vs .intValue
,.array
vs .arrayValue
等。
答案 1 :(得分:3)
!
是危险的,特别是当你不知道它是否是可选的时。只需这样:
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)
}
}
})
}
}
答案 2 :(得分:-1)
那是因为你这样做是让 fbJson = JSON(结果) 而不是让fbJson = JSON(结果!)