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破坏了我的代码