我刚刚将我的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
}
问题是在函数声明中,sourceApplication
是可选的:
func application(application: UIApplication,
openURL url: NSURL,
sourceApplication: NSString?, // note, NSString? so optional
annotation: AnyObject) -> Bool
但是在对FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication)
的调用中,sourceApplication
是NSString
,即非选择性的。
您需要使用sourceApplication
解包输入if-let
值,或者使用??
(即FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication ?? "defaultAppName")
)将其默认,或者如果您控制application
函数的声明,则需要更好,首先它不是可选的。
谢谢@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
}
它完美地运作!!