Swift:Force unwrap是零,但没有崩溃......?

时间:2016-05-10 06:05:06

标签: ios swift syntax

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,那么返回的错误参数的强制解包肯定会导致崩溃,不是吗?为什么这不会导致崩溃?

2 个答案:

答案 0 :(得分:5)

在该代码中,您从未解开error。甚至没有暗示。

由于ImplicitlyUnwrappedOptional符合CustomStringConvertibleprint函数无需解包。相反,print函数调用ImplicitlyUnwrappedOptional description的实现(返回字符串"nil")。

当您将ImplicitlyUnwrappedOptionalnil进行比较时,Swift无法解开它。它将其视为常规Optional。来自The Swift Programming Language (Swift 2.2)

  

您仍然可以将隐式解包的可选项视为普通的可选项,以检查它是否包含值:

答案 1 :(得分:0)

我不知道为什么,但它只是那样:

let withoutCrash: String! = nil
withoutCrash


let withCrash: String? = nil
withCrash!