注意
Swift 正在 swift 变化,这个问题是关于:
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()
问题:
有没有办法让返回泛型参数通过可选性推断适当的重载?
如果没有
这是一个语言功能,还是某个地方的错误。如果是语言功能,请解释防止出现此行为的根本问题。
最佳答案
第一个示例不明确,因为 T
可以推断为 String
和String?
.
第二个例子并不含糊,因为 String
是 Equatable
但是String?
不是,所以T : Equatable
不能推断为 String?
.
第三种情况并不含糊,因为 [T]
不是
推断为[String]?
.
备注:一般来说,Optional<Wrapped>
不符合Equatable
即使Wrapped
与 Array<Element>
一样
不符合Equatable
即使Element
做。
这是 Swift 当前类型系统的限制
future 版本可能会改进,比较一下
来自 Swift 开发邮件列表。
关于swift - 为什么 swift 不使用没有类型约束的通用返回参数来推断适当的重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122280/