在Swift中,很少但可能会出现非可选类型的值为nil的情况。正如这个问题的答案所解释的那样,这可能是由于翻译到Swift的Objective-C代码有问题造成的:
- (NSObject * _Nonnull)someObject {
return nil;
}
或者是糟糕的Swift代码:
class C {}
let x: C? = nil
let y: C = unsafeBitCast(x, to: C.self)
实际应用中,我在使用MessageUI
库中的MFMailComposeViewController
API 时遇到了这个问题。下面的代码创建了一个非可选的MFMailComposeViewController
,但是如果用户没有在邮件中设置电子邮件帐户,则以下代码会崩溃,并显示EXC_BAD_ACCESS
:
let mailComposeViewController = MFMailComposeViewController()
print("\(mailComposeViewController)")
调试器显示
mailComposeViewController
的值如下:mailComposeViewController = (MFMailComposeViewController) 0x0000000000000000
我有几个问题:
- 我注意到unsafeBitCast(_:to:)的
documentation
说它“打破了 Swift 类型系统的保证”,但是在 Swift 文档中有没有解释这些保证可能被打破,以及如何/何时打破这些保证的地方? - 检查这种情况的惯用方式是什么?编译器不允许我检查
mailComposeViewController == nil
,因为它不是可选的。