swift - 为什么 swift 不使用没有类型约束的通用返回参数来推断适当的重载函数?

标签 swift generics overloading type-inference

注意

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可以推断为 StringString? .

第二个例子并不含糊,因为 StringEquatable但是String?不是,所以T : Equatable不能推断为 String? .

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

备注:一般来说,Optional<Wrapped>不符合Equatable 即使WrappedArray<Element> 一样 不符合Equatable即使Element做。 这是 Swift 当前类型系统的限制 future 版本可能会改进,比较一下

来自 Swift 开发邮件列表。

关于swift - 为什么 swift 不使用没有类型约束的通用返回参数来推断适当的重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122280/

相关文章:

generics - StructureMap 2.6.1,一个 IRepository<T> 和一个 EFRepository<T,TContext>

java - Spring MVC : How to return different type in ResponseEntity body

ios - 从通知中心移除 “local or remote notifications”

Swift ZSH 自动补全

ios - 无法调用非函数类型的值(声明为 var)

ios - 在与非泛型父类(super class)同名的泛型类中使用类方法时出错

c++ - 具有前向声明的转换运算符

C++:如何从我自己的函数中的头文件中调用一个函数(比如 funA()),它的名字也是 funA()?

C++ 模板重载 - 调用了错误的函数

ios - 从本地路径播放视频