强制转换为Swift中的泛型内部可选

时间:2016-12-05 08:14:17

标签: swift generics casting

我以为我认识斯威夫特。直到今天。试图投射一个给定的值,这一切都按预期工作,直到我使用泛型,但不是任何通用...

import Foundation

func castA<T, U>(value: U) -> T {
    return value as! T
}

func castB<T>(value: AnyObject?) -> T {
    return value as! T
}

typealias Foo = String?

let bar: AnyObject? = "foo"
let baz: AnyObject? = nil

print(bar as! String?) // Optional("foo")
print(baz as! String?) // nil

print(bar as! Foo) // Optional("foo")
print(baz as! Foo) // nil

print(castA(bar) as String?) // Optional("foo")
print(castA(baz) as String?) // nil

print(castB(bar) as String?) // Optional("foo")
print(castB(baz) as String?) // fatal error: unexpectedly found nil while unwrapping an Optional value

指定这两种类型的技巧在castA中起作用,但几乎相同的castB在相同的输入下失败。我想知道发生了什么,以及是否可以使castB示例工作。我需要在Swift 2.2中使用它,但是如果在Swift 3中有所改变的信息是受欢迎的。

0 个答案:

没有答案