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 数据到 NSDictionaryNSArray 对象的转换。 如果出现错误,则为 nil。

因此,您需要将其转换为 Swift Dictionary 为 [String : AnyObject],然后从中获取您的“电子邮件”字符串:

if let unwrappedResult = result as? [String : Any], let email = unwrappedResult["email"] as? String 
    print(email)

【讨论】:

我无法收到 Facebook 用户的电子邮件 @Meas 你确定用户允许显示他/她的电子邮件吗?这取决于用户隐私设置。如果errornil,那么你应该得到想要的数据——比如电子邮件——。

以上是关于FBSDKGraphRequest:结果 - 可选类型“任何?”的值未拆封;你的意思是用'!'或者 '?'?的主要内容,如果未能解决你的问题,请参考以下文章

带有 FBSDKGraphRequest 的 NSInvalidArgumentException

发布带有标签的照片时获取“不支持的 FBSDKGraphRequest 附件”

使用 Parse 通过 Facebook 登录后跳过 FBSDKGraphRequest

从 FBSDKGraphRequest 获取照片时出现“不支持的 URL”

使用 SWIFT 在 iOS SDK for Facebook 上使用 FBSDKGraphRequest

FBSDKGraphRequest FBSDKGraphRequestConnection 仅在 iOS 9 中返回错误