使用 FBSDKApplicationDelegate 时对成员“下标”的模糊引用

Posted

技术标签:

【中文标题】使用 FBSDKApplicationDelegate 时对成员“下标”的模糊引用【英文标题】:Ambiguous reference to member 'subscript' when using FBSDKApplicationDelegate 【发布时间】:2016-09-15 08:51:46 【问题描述】:

我更新了swift 3,发现很多错误。这是其中之一:

对成员“下标”的模糊引用

下面一行

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool 
        FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options["UIApplicationOpenURLOptionsSourceApplicationKey"] as? String, annotation: options["UIApplicationOpenURLOptionsAnnotationKey"] as? String)

        return true
    

我不知道我为什么会得到这个,有其他人知道吗?

在以前的版本 7.3.1 swift 2 中运行良好。

【问题讨论】:

【参考方案1】:

options 字典的类型已从 [String: AnyObject] 更改为 [UIApplicationOpenURLOptionsKey : Any],这意味着您应该使用 UIApplicationOpenURLOptionsKey 下标,而不是像现在这样使用 String

试试这个:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 
    guard let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
        let annotation = options[UIApplicationOpenURLOptionsKey.annotation] else 
            return false
    

    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url,
                                                                 sourceApplication: sourceApplication,
                                                                 annotation: annotation)


此代码从options 中提取您要查找的密钥并将它们传递给FBSDKApplicationDelegate。注意使用UIApplicationOpenURLOptionsKey.sourceApplicationUIApplicationOpenURLOptionsKey.annotation 来访问选项字典中的值。

【讨论】:

您的代码仅在 ios 9.0 以上版本中可用。如果我仍然使用 8.4 版怎么办?谢谢 根据 Apple 的文档,此版本的方法仅适用于 iOS9+。我不确定同时支持 iOS8 和 iOS9 的最佳做法是什么,因为这种方法似乎与两者都不兼容。developer.apple.com/reference/uikit/uiapplicationdelegate/… 是的,也许我需要遵守苹果的规则。谢谢【参考方案2】:

这是使用 swift 3 和 Xcode 8 处理 iOS 9 之前和之后的版本的方法

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool 


    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)


@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 


    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])


希望对你有帮助!

【讨论】:

以上是关于使用 FBSDKApplicationDelegate 时对成员“下标”的模糊引用的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)