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

Swift 为什么在转换为相同类型时泛型函数会崩溃?,swift,Swift,以下是一些操场代码: func getNone<T>() -> T { print(T.self) let none: Bool? = nil return none as! T } let noMore: Bool? = getNone() func getNone()->T{ 打印(T.self) 不允许:Bool?=nil 返回none作为!T } 让诺莫尔:布尔?=getNone() 但是,此代码在展开可选错误时会导致发现nil。我想

以下是一些操场代码:

func getNone<T>() -> T {

    print(T.self)

    let none: Bool? = nil

    return none as! T
}

let noMore: Bool? = getNone()
func getNone()->T{
打印(T.self)
不允许:Bool?=nil
返回none作为!T
}
让诺莫尔:布尔?=getNone()

但是,此代码在展开可选错误时会导致
发现nil
。我想知道为什么会发生这种情况,因为本例中的
T
显然是打印语句中的
Bool?
,而将
nil
强制转换为
Bool?
不会导致此错误。

这在我看来像是Swift中的一个错误。我甚至还添加了几个打印语句来强调这一点:

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()
func getNone()->T{
不允许:Bool?=nil
打印(类型(of:none)=T.self)//打印“true”
print(none是T)//prints“false”。如果上面是真的,那怎么可能呢?
返回none作为!T//崩溃
}
让诺莫尔:布尔?=getNone()

更新: 类似的/相关的行为已经存在一些缺陷。例如:


他们建议哈米什在下面的评论中提到的解决方法。几乎可以肯定的是,在本例中,您确实遇到了一个Swift bug。

一个解决方法:
尽可能不返回任何错误!T
。看起来编译器假定
T
是非可选的,因此强制展开在强制转换之前。首先对
Any
进行强制转换会阻止它这样做。对于任何感兴趣的人来说,这正是我所怀疑的;当源类型比目标类型更可选时,执行此操作的相关类型检查器代码位于此处:。实际上,如果目标类型是可选性较差的通用占位符(原型),那么它应该跳过强制展开,并将其留给运行时,因为运行时类型可能是可选的。如果我有时间,我会尝试尝试修复。你为什么想要这个
T
确实可以是一个可选类型,但如果不是呢?@Hamish我有一个从其他函数返回值的函数,因此我决定使用泛型,让它从调用它的位置推断出它的类型,而不是每次调用它时都强制转换为预期的返回类型。大多数“其他”函数返回非可选的,但有一个返回可选的,所以这个bug破坏了我的代码