值有时会作为可选字符串返回 SwiftyJSON
Posted
技术标签:
【中文标题】值有时会作为可选字符串返回 SwiftyJSON【英文标题】:Value sometimes returns as optional string with SwiftyJSON 【发布时间】:2016-04-01 01:22:11 【问题描述】:我想知道为什么 SwiftyJSON 有时会返回 "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 将返回:Optional("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 将返回 "myString"
那么当两个函数都使用 ".string" 而不是 ".string!" 时,一个函数如何返回 optional() 呢?
【问题讨论】:
在第二种情况下,您如何打印token
?
【参考方案1】:
SwiftyJSON 有两种用于检索值的“getter”:可选的和非可选的。
.string
是一个值的字符串表示的可选 getter,所以你必须在使用前打开它
if let fbId = fbJson["id"].string
print(fbId)
否则字符串本身将包含术语“可选”。
如果您100% 确定总会有一个值,则可以通过使用非可选 getter 来使用等效于“强制展开”的方法,并且不需要 if let
不再:
let fbId = fbJson["id"].stringValue
但要小心,因为如果值为 nil,这将崩溃,就像您使用 fbJson["id"].string!
强制解包一样(您不应该这样做)。
请注意,SwiftyJSON 对其他类型的工作方式相同:.int
vs .intValue
、.array
vs .arrayValue
等
【讨论】:
【参考方案2】:!
很危险,尤其是当您不知道它是否是可选的时。请这样做:
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)
)
【讨论】:
【参考方案3】:那是因为你这样做让 fbJson = JSON(result) 而不是 let fbJson = JSON(result!)
【讨论】:
以上是关于值有时会作为可选字符串返回 SwiftyJSON的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swiftyjson 中检查值是日期字符串还是双精度值?
使用 Alamofire 和 SwiftyJson 从函数返回值
条件绑定的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON [重复]