gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:37:49 24 4
gpt4 key购买 nike

注意

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 中当前类型系统的限制以后的版本可能会改进,比较一下

来自 Swift 开发邮件列表。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com