[swift]为什么可以零从返回非可选的功能在这种情况下呢?

标签: Swift2 Swift
发布时间: 2017/3/6 22:53:50
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想在操场上添加的代码下面和我不太明白为什么编译器不会给出错误消息时 bar ,即 nil ,从一个非可选的函数; 返回和为什么它本质上是当 nil 被比作是 nil 并给出了一条错误消息时声称,看起来不正确 foobar 绝不能 nil

编辑︰ 自 Optional 也是 Any ,为什么返回 nil 直接在 foo2 不允许的吗?

func foo() -> Any {
    let bar: String? = nil
    return bar
}

let foobar = foo()

if foobar == nil {

}

func foo2() -> Any {
    return nil
}

enter image description here

解决方法 1:

让我们解释到底什么发生在您的代码︰

func foo() -> Any {
    let bar: String? = nil
    return bar
}

nil是获取转换为键入的文本 String? (或 Optional<String> ),就是到 Optional<String>.None

然后它强制转换为 Any 。任何可强制转换为 Any ,包括件。基本上你已经决定要隐藏的下划线类型。

然后 foobar == nil 。请注意, == 是不是自动可用于所有类型的操作。与比较 nil 上可选的类型,例如定义为 Optional<T> 与另一个 Optional<T>

在这种情况下你有 Anynil 字面。 Any 本身就是不可选的因此你不能把它直接与比 nil

你可以将它强制转换为一个可选 Any

let optionalFoobar = any as Any?

然而,现在该变量包含一个双精度可选 Optional<Any>.Some(Optional<String>.None) 和比较与 nil 不会工作。

唯一会的工作将是︰

if (foobar as Any?) as? String == nil {
    print("is nil")
}

总之,不要使用 Any ,如果您正在使用非可选 Any ,不要将可选类型存储到它,它会得到真的很复杂,在实践中无法使用。

赞助商