首页 > 解决方案 > 如何结合文字使用 Swift 不透明类型?

问题描述

我有以下功能

func greater<T: Comparable>(_ lhs: T, rhs: T) -> some Comparable {
    lhs > rhs ? lhs : rhs
}

但是当我尝试以下操作时出现错误

greater(greater(1, 2), 3) // Cannot convert value of type 'Int' to expected argument type 'some Comparable'

我理解错误,但为什么编译器不能推断出这两种类型实际上都是Ints?

标签: swiftgenericsopaque-types

解决方案


您不应该根据需要使用不透明的返回类型。一个简单的通用返回类型就足够了。

在您的示例中,不透明返回类型的问题在于它掩盖了实际的类型信息,因此 ofgreater(1, 2)的类型与3-的类型不同,some Comparable并且Int即使那some Comparable实际上是Int.

此外,您希望返回与输入参数完全相同的类型,即T,而不是some Comparable。如果您的返回类型是some Comparable,您可以轻松地从您的函数返回任何其他Comparable类型,而不是返回输入类型。

正确的实现是:

func greater<T: Comparable>(_ lhs: T, rhs: T) -> T {
    lhs > rhs ? lhs : rhs
}

推荐阅读