为什么在转换为相同类型时泛型函数会崩溃?

时间:2017-12-14 23:32:24

标签: swift

这是一些游乐场代码:

func getNone<T>() -> T {

    print(T.self)

    let none: Bool? = nil

    return none as! T
}

let noMore: Bool? = getNone()

但是,此代码会导致found nil while unwrapping optional error。我想知道为什么会发生这种情况,因为T在这种情况下显然是Bool? - 来自print语句 - 并且nil转换为Bool?并没有&#39} ; t导致此错误。

1 个答案:

答案 0 :(得分:1)

这看起来像Swift中的一个bug给我。我甚至添加了几个印刷语句来强调这一点:

func getNone<T>() -> T {
    let none: Bool? = nil
    print(type(of: none) == T.self) // prints "true"
    print(none is T) // prints "false". How can that be given the above is true?
    return none as! T // crashes
}

let noMore: Bool? = getNone()

UPDATE:

围绕类似/相关行为已经提出了一些错误。例如:

https://bugs.swift.org/browse/SR-4248

https://bugs.swift.org/browse/SR-158

他们建议Hamish在下面的评论中指出相同的解决方法。几乎可以肯定的是,在这种情况下你确实偶然发现了一个Swift错误。