【问题标题】: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)
        }
    }

【问题讨论】:

    标签: ios swift facebook-graph-api


    【解决方案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,那么你应该得到想要的数据——比如电子邮件——。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2015-11-11
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多