为什么不使用没有类型约束的泛型返回参数快速推断出适当的重载函数?

时间:2015-12-06 20:23:31

标签: swift generics overloading type-inference

注意

斯威夫特正在迅速变化,这个问题被问到:

  

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泛型参数通过可选性推断出适当的重载?

如果没有

这是一种语言功能,还是某个地方的错误。如果它是一种语言功能,请解释阻止此行为可能性的根本问题。

1 个答案:

答案 0 :(得分:2)

第一个示例含糊不清,因为T可以推断为StringString?

第二个示例不明确,因为StringEquatableString?不是,因此T : Equatable无法推断为String?

第三种情况并不含糊,因为[T]不是 推断为[String]?

备注:通常,Optional<Wrapped>不符合Equatable 即使Wrapped有,也与Array<Element>相同 即使Equatable有效,也不符合Element。 这是对Swift中当前类型系统的限制 可能会在将来的版本中进行改进,比较

来自Swift开发邮件列表的