无法使用类型为“(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)
的调用中,sourceApplication
是NSString
,即非可选。
您需要使用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?)”的参数列表调用“*”的主要内容,如果未能解决你的问题,请参考以下文章