注意
斯威夫特正在迅速变化,这个问题被问到:Xcode 7,Swift 2.0
解释
我正在寻求实现泛型返回参数。通常,我发现有必要实现可选的版本重载,以便我可以访问底层类型并适当地处理它。这是一些制造的功能。 String的赋值只是作为复制的占位符:
func ambiguous<T>() -> T {
let thing = "asdf"
return thing as! T
}
func ambiguous<T>() -> T? {
return nil
}
现在,如果我们看一下实现:
// Fine
let a: String = ambiguous()
// Ambiguous
let b: String? = ambiguous()
这似乎很明显,因为您可以将类型T
分配给T?
类型的变量。因此,推断它会有问题是有道理的。问题是,对于类型约束,它突然起作用。 (这可以是任何事情,我使用Equatable
轻松复制。
func nonAmbiguous<T : Equatable>() -> T {
let thing: AnyObject = "asdf"
return thing as! T
}
func nonAmbiguous<T : Equatable>() -> T? {
return nil
}
现在,它按预期运行:
// Fine
let c: String = nonAmbiguous()
// Fine
let d: String? = nonAmbiguous()
注意,这也适用于其他类型:
func nonAmbiguous<T>() -> [T] {
let thing: AnyObject = ["asdf"]
return thing as! [T]
}
func nonAmbiguous<T>() -> [T]? {
return nil
}
// Fine
let e: [String] = nonAmbiguous()
// Fine
let d: [String]? = nonAmbiguous()
问题:
有没有办法让return泛型参数通过可选性推断出适当的重载?
如果没有
这是一种语言功能,还是某个地方的错误。如果它是一种语言功能,请解释阻止此行为可能性的根本问题。
答案 0 :(得分:2)
第一个示例含糊不清,因为T
可以推断为String
和String?
。
第二个示例不明确,因为String
为Equatable
但String?
不是,因此T : Equatable
无法推断为String?
。
第三种情况并不含糊,因为[T]
不是
推断为[String]?
。
备注:通常,Optional<Wrapped>
不符合Equatable
即使Wrapped
有,也与Array<Element>
相同
即使Equatable
有效,也不符合Element
。
这是对Swift中当前类型系统的限制
可能会在将来的版本中进行改进,比较
。