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

问题描述 投票:1回答:2

我刚刚将我的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:Objective-C方法'应用程序:openURL:sourceApplication:annotation:'由方法提供'应用程序(: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
    }
ios swift xcode6
2个回答
1
投票

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

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

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

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


0
投票

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

它完美地运作!!

© www.soinside.com 2019 - 2024. All rights reserved.