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)
我在这里有几个问题:
unsafeBitCast(_:to:)表示,“断雨燕系统的保障,”但有斯威夫特文档中的一个地方,解释说,这些保证可以被打破,以及如何/何时?mailComposeViewController == nil因为它不是可选的。甚至Apple的API有时也会返回nil未在API中标记为“可选”的类型。解决方案是将其分配给Optional。
例如,有一阵子traitCollectionDidChange返回了一个UITraitCollection,尽管实际上它可能是nil。您无法检查它,nil因为Swift不允许您检查的非可选nil。
解决方法是立即将返回值分配给a UITraitCollection?并检查是否为nil。无论您的用例如何,这种事情都应该起作用(尽管您的邮件示例不是用例,因为您从一开始就做错了)。
| 归档时间: |
|
| 查看次数: |
1068 次 |
| 最近记录: |