在Swift中检查非可选值是否为nil的最佳方法

Luk*_*uke 2 null nullable objective-c optional swift

在Swift中,这种情况很少见,但最终可能会得到一个非零类型的值,该值具有nil值。如对这个问题的回答所述,这可能是由桥接到Swift的不良Objective-C代码引起的:

- (NSObject * _Nonnull)someObject {
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

或通过错误的Swift代码:

class C {}
let x: C? = nil
let y: C = unsafeBitCast(x, to: C.self)
Run Code Online (Sandbox Code Playgroud)

实际上,我已经在中使用了MFMailComposeViewControllerAPI MessageUI。以下代码创建一个非可选的MFMailComposeViewController,但是如果用户尚未在Mail中设置电子邮件帐户,则以下代码将崩溃EXC_BAD_ACCESS

let mailComposeViewController = MFMailComposeViewController()
print("\(mailComposeViewController)")
Run Code Online (Sandbox Code Playgroud)

调试器显示如下值mailComposeViewController

mailComposeViewController = (MFMailComposeViewController) 0x0000000000000000
Run Code Online (Sandbox Code Playgroud)

我在这里有几个问题:

  1. 我注意到,该文件unsafeBitCast(_:to:)表示,“断雨燕系统的保障,”但有斯威夫特文档中的一个地方,解释说,这些保证可以被打破,以及如何/何时?
  2. 检查这种情况的最好,最惯用的方法是什么?编译器不会让我检查是否,mailComposeViewController == nil因为它不是可选的。

mat*_*att 5

甚至Apple的API有时也会返回nil未在API中标记为“可选”的类型。解决方案是将其分配给Optional。

例如,有一阵子traitCollectionDidChange返回了一个UITraitCollection,尽管实际上它可能是nil。您无法检查它,nil因为Swift不允许您检查的非可选nil

解决方法是立即将返回值分配给a UITraitCollection?并检查是否nil。无论您的用例如何,这种事情都应该起作用(尽管您的邮件示例不是用例,因为您从一开始就做错了)。