无法使用类型为“(NSURL,*:NSString?)”的参数列表调用“*”

Posted

技术标签:

【中文标题】无法使用类型为“(NSURL,*:NSString?)”的参数列表调用“*”【英文标题】:Cannot invoke '*' with an argument list of type '(NSURL, *: NSString?)' 【发布时间】:2015-04-30 18:49:41 【问题描述】:

我刚刚将我的 Xcode 更新到 6.3.1 问题是我的 Facebook 集成突然产生了奇怪的错误。在此之前(Swift 1.1 和 Xcode 6.2)完全没有问题。

错误信息 1

/Users/MNurdin/Documents/ios/xxxxx/AppDelegate.swift:33:41:不能 使用类型为 '(NSURL, sourceApplication: NSString?)'

错误信息 2

/Users/MNurdin/Documents/iOS/xxxxx/AppDelegate.swift:32:10: Objective-C 方法 'application:openURL:sourceApplication:annotation:' 方法提供 'application(:openURL:sourceApplication:annotation:)' 与 可选要求法 'application(:openURL:sourceApplication:annotation:)' 在协议中 'UIApplicationDelegate'

我的代码

func application(application: UIApplication, openURL url: NSURL, sourceApplication: NSString?, annotation: AnyObject) -> Bool  //error message 1 here
        var wasHandled:Bool = FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication) //error message 2 here
        return wasHandled
    

【问题讨论】:

【参考方案1】:

问题是在你的函数声明中,sourceApplication 是一个可选的:

func application(application: UIApplication, 
        openURL url: NSURL, 
        sourceApplication: NSString?,     // note, NSString? so optional
        annotation: AnyObject) -> Bool

但在对FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication) 的调用中,sourceApplicationNSString,即非可选。

您需要使用if-let 解开输入sourceApplication 值,或者默认使用??FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication ?? "defaultAppName"),或者如果您控制application 函数的声明则更好首先是可选的。

【讨论】:

了解选项。如果不知道这一点,您将无法编写 swift 代码,告诉您如何解决这个特定问题也无济于事。从official docs 开始。您也可以尝试阅读this answer 了解一些基本技巧。【参考方案2】:

谢谢@airspeed。我已经完全了解可选的了。所以我现在做的是这样的

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool  //error message 1 here
        var wasHandled:Bool = FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication!) //error message 2 here
        return wasHandled
     

效果很好!!

【讨论】:

以上是关于无法使用类型为“(NSURL,*:NSString?)”的参数列表调用“*”的主要内容,如果未能解决你的问题,请参考以下文章

裁剪 NSURL / NSString

使用下标时出错:无法使用类型索引为类型值下标...

无法使用类型为“()”的参数列表为类型“Int”调用初始化程序

无法使用类型为“”的参数列表调用类型“”的初始化程序

无法使用类型为 '(Codable.Type?

Constraint 无法解析为类型