我如何表达一个 Swift 泛型函数,它的约束T
是Optional<Equatable>
?
我已经尝试过类似以下的事情,结果出现错误。
func gen<T>(arg: T) where T : Optional<Equatable>
func gen<T>(arg: T) where T : OptionalProtocol<Equatable>
func gen<T, U>(arg: T) where T : Optional<U>, U : Equatable
谢谢。
我在做类似的事情
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
提示什么。
这应该有效:
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)
记住,
泛型用于类型要求的可变部分。你需要的Optional
是不变的;这是可选的 -什么部分是可变的。因此,将可选性放在实际的 func 声明中,并保留可选性 -泛型是什么。
类型参数中的冒号表示子类型关系。类型T
不能是 of 的子类型,Optional<Something>
因为Optional
是枚举——只有类和协议可以有子类型(分别是子类和符合类型)。同样,泛型不是协变的,所以Optional<Foo>
其中Foo
采用Equatable
不是Optional<T: Equatable>
.