Swift 通用 func gen<T>(arg: T) where T : Optional<U>, U : Equatable

fra*_*ose 4 generics swift

我如何表达一个 Swift 泛型函数,它的约束TOptional<Equatable>

我已经尝试过类似以下的事情,结果出现错误。

func gen<T>(arg: T) where T : Optional<Equatable>

  • 类型 'T' 限制为非协议类型 'Optional'

func gen<T>(arg: T) where T : OptionalProtocol<Equatable>

  • 不能专门化非泛型类型“OptionalProtocol”

func gen<T, U>(arg: T) where T : Optional<U>, U : Equatable

  • 类型 'T' 限制为非协议类型 'Optional'
  • 函数签名中未使用通用参数“U”

谢谢。

编辑

我在做类似的事情

if let a = arg, let b = argb
    return a==b
Run Code Online (Sandbox Code Playgroud)

事实证明,我的错误根本不在模板中,只是我正在使用的对象实际上并不是 Equatable。我想我假设 Swift 会为一个结构体生成 == ,其元素本身都是 =='able,但事实并非如此。下次我会知道错误Expression type 'Bool' is ambiguous without more context提示什么。

ric*_*ter 8

这应该有效:

func gen<T>(arg: T?) where T : Equatable { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

这相当于:

func gen<T>(arg: Optional<T>) where T : Equatable { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

记住,

  1. 泛型用于类型要求的可变部分。你需要的Optional是不变的;这是可选的 -什么部分是可变的。因此,将可选性放在实际的 func 声明中,并保留可选性 -泛型是什么

  2. 类型参数中的冒号表示子类型关系。类型T不能是 of 的子类型,Optional<Something>因为Optional是枚举——只有类和协议可以有子类型(分别是子类和符合类型)。同样,泛型不是协变的,所以Optional<Foo>其中Foo采用Equatable不是Optional<T: Equatable>.