繁体   English   中英

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

[英]Cannot invoke '*' with an argument list of type '(NSURL, *: NSString?)'

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

错误信息1

/Users/MNurdin/Documents/iOS/xxxxx/AppDelegate.swift:33:41:无法使用类型为((NSURL,sourceApplication:NSString?)'的参数列表调用'handleOpenURL'

错误信息2

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

我的密码

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
    }

问题在于,在函数声明中, 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 FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication ?? "defaultAppName")的声明,甚至更好,那么它首先不是可选的。

谢谢@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
    } 

它完美地工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM