相关疑难解决方法(0)

为什么非可选任何可以保持零?

在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进行测试

optional swift

33
推荐指数
2
解决办法
1万
查看次数

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

在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因为它不是可选的。

null nullable objective-c optional swift

2
推荐指数
1
解决办法
1068
查看次数

标签 统计

optional ×2

swift ×2

null ×1

nullable ×1

objective-c ×1