FBSDKGraphRequest:结果 - 可选类型“任何?”的值未拆封;你的意思是用'!'或者 '?'?
Posted
技术标签:
【中文标题】FBSDKGraphRequest:结果 - 可选类型“任何?”的值未拆封;你的意思是用\'!\'或者 \'?\'?【英文标题】:FBSDKGraphRequest : result - Value of optional type 'Any?' not unwrapped; did you mean to use '!' or '?'?FBSDKGraphRequest:结果 - 可选类型“任何?”的值未拆封;你的意思是用'!'或者 '?'? 【发布时间】:2017-11-21 12:34:59 【问题描述】:原始语法:
错误是
可选类型“任何?”的值未拆封;你的意思是用'!' 或者 '?'?关于
result
变量
FBSDKGraphRequest(graphpath: "me", parameters: parameter).start (connection, result, error) in
if error != nil
print(error)
return
if let email = result["email"] as? String
print(email)
【问题讨论】:
【参考方案1】:如果result
应该是字典,则必须可选向下转换并将Any?
解包为预期类型:
if let item = result as? [String:Any],
let email = item["email"] as? String
print(email)
【讨论】:
那么结果的结构不匹配。可以的话发result
result
可能不包含“email”,取决于登录用户是否要显示他/她的email,这与隐私政策有关...【参考方案2】:
start
方法的 completionHandler
闭包包含三个参数,实现如下(目标 C):
typedef void (^FBSDKGraphRequestHandler)(FBSDKGraphRequestConnection *connection,
id result,
NSError *error);
Source code reference.
因此,id
数据类型将从 transformed 变为 Any
(可选)类型,这意味着对于 Swift 闭包,参数将是:
(FBSDKGraphRequestConnection?, Any?, Error?)
如文档中所述:
参数result:请求的结果。这是 JSON 数据到NSDictionary
和NSArray
对象的转换。 如果出现错误,则为 nil。
因此,您需要将其转换为 Swift Dictionary 为 [String : AnyObject]
,然后从中获取您的“电子邮件”字符串:
if let unwrappedResult = result as? [String : Any], let email = unwrappedResult["email"] as? String
print(email)
【讨论】:
我无法收到 Facebook 用户的电子邮件 @Meas 你确定用户允许显示他/她的电子邮件吗?这取决于用户隐私设置。如果error
是nil
,那么你应该得到想要的数据——比如电子邮件——。以上是关于FBSDKGraphRequest:结果 - 可选类型“任何?”的值未拆封;你的意思是用'!'或者 '?'?的主要内容,如果未能解决你的问题,请参考以下文章
带有 FBSDKGraphRequest 的 NSInvalidArgumentException
发布带有标签的照片时获取“不支持的 FBSDKGraphRequest 附件”
使用 Parse 通过 Facebook 登录后跳过 FBSDKGraphRequest
从 FBSDKGraphRequest 获取照片时出现“不支持的 URL”
使用 SWIFT 在 iOS SDK for Facebook 上使用 FBSDKGraphRequest
FBSDKGraphRequest FBSDKGraphRequestConnection 仅在 iOS 9 中返回错误