Facebook SDK(4.x)有一个委托协议,强制解包返回的错误。
extension FacebookLoginViewController: FBSDKLoginButtonDelegate {
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
print("\(error)")
if error == nil && result.isCancelled == false {
//success
}
}
}
在运行时,当我取消登录过程时,不会返回任何错误,并且上述错误提示为零。如果错误值为nil,那么返回的错误参数的强制解包肯定会导致崩溃,不是吗?为什么这不会导致崩溃?
答案 0 :(得分:5)
在该代码中,您从未解开error
。甚至没有暗示。
由于ImplicitlyUnwrappedOptional
符合CustomStringConvertible
,print
函数无需解包。相反,print函数调用ImplicitlyUnwrappedOptional
description
的实现(返回字符串"nil"
)。
当您将ImplicitlyUnwrappedOptional
与nil
进行比较时,Swift无法解开它。它将其视为常规Optional
。来自The Swift Programming Language (Swift 2.2):
您仍然可以将隐式解包的可选项视为普通的可选项,以检查它是否包含值:
答案 1 :(得分:0)
我不知道为什么,但它只是那样:
let withoutCrash: String! = nil
withoutCrash
let withCrash: String? = nil
withCrash!