如何表达限制T
为Optional<Equatable>
的Swift泛型函数?
我已经尝试了以下内容,结果是错误。
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
事实证明,我的错误根本不在模板中,只是我正在使用的对象实际上并不是Equatable。我想我认为Swift会为一个结构生成==,结构中的元素本身都是==&#39;能够,但事实并非如此。下次我会知道错误Expression type 'Bool' is ambiguous without more context
建议的内容。
答案 0 :(得分:4)
这应该有效:
func gen<T>(arg: T?) where T : Equatable { /*...*/ }
这相当于:
func gen<T>(arg: Optional<T>) where T : Equatable { /*...*/ }
记住,
泛型是针对您的类型要求的可变部分。您需要Optional
是不变的;它是变量的可选 - 部分。因此,将可选性置于实际的func声明中,并保留可选的用于泛型的。
类型参数中的冒号表示子类型关系。类型T
不能是Optional<Something>
的子类型,因为Optional
是枚举 - 只有类和协议可以有子类型(子类和符合类型)。同样,泛型不是协变的,因此Optional<Foo>
Foo
采用Equatable
的{{1}}不是Optional<T: Equatable>
的子类型。
答案 1 :(得分:0)
func gen<T>(arg: T?) where T : Equatable {
if let arg = arg {
print("arg is '\(arg)', Equatable")
} else {
print("arg is nil")
}
}
let testValue1: Int? = 1
gen(arg: testValue1)
let testValue2: String? = "One"
gen(arg: testValue2)
let testValue3: String? = nil
gen(arg: testValue3)
arg is '1', Equatable
arg is 'One', Equatable
arg is nil