在Swift中,我可以声明一个类型的常量Any并将其String放入其中.
let any: Any = "hello world"
Run Code Online (Sandbox Code Playgroud)
好.另一方面,我不能将nil值放入,any因为它不是可选的.
let any: Any = nil
error: nil cannot initialize specified type 'Any' (aka 'protocol<>')
let any: Any = nil
^
Run Code Online (Sandbox Code Playgroud)
完善.但是为什么编译器允许我编写以下代码?
let couldBeNil: String? = nil
let any: Any = couldBeNil
print(any) // nil
Run Code Online (Sandbox Code Playgroud)
不Any遵循Swift规则只能填充一个Optional var/let nil吗?
使用Xcode Playground 7.2 + Swift 2.1.1进行测试
在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因为它不是可选的。