Swift通用功能总成<;T>;(arg:T)其中T:可选<;U>;,U:相等的
如何表达一个Swift通用函数,该函数约束Swift通用功能总成<;T>;(arg:T)其中T:可选<;U>;,U:相等的,swift,generics,Swift,Generics,如何表达一个Swift通用函数,该函数约束T为可选 我已经尝试过下面这样的方法,并产生了错误 func-gen(arg:T),其中T:Optional 类型“T”约束为非协议类型“可选” func-gen(arg:T),其中T:OptionalProtocol 无法专门化非泛型类型“OptionalProtocol” func-gen(arg:T),其中T:可选,U:可平衡 类型“T”约束为非协议类型“可选” 函数签名中未使用泛型参数“U” 谢谢 编辑 我在做类似的事情 if let
T
为可选
我已经尝试过下面这样的方法,并产生了错误
func-gen(arg:T),其中T:Optional
- 类型“T”约束为非协议类型“可选”
func-gen(arg:T),其中T:OptionalProtocol
- 无法专门化非泛型类型“OptionalProtocol”
func-gen(arg:T),其中T:可选,U:可平衡
- 类型“T”约束为非协议类型“可选”
- 函数签名中未使用泛型参数“U”
谢谢
编辑
我在做类似的事情
if let a = arg, let b = argb
return a==b
事实证明,我的错误根本不是在模板中,只是我使用的对象实际上不可等分。我想我假设Swift会为一个结构生成==,该结构的元素本身都是=='able的,但事实并非如此。下次我将知道表达式类型“Bool”在没有更多上下文的情况下不明确的错误是什么
func gen<T>(arg: T?) where T : Equatable {
if let arg = arg {
print("arg is '\(arg)', Equatable")
} else {
print("arg is nil")
}
}
控制台输出
这应该起作用:
func gen<T>(arg: T?) where T : Equatable { /*...*/ }
func-gen(arg:T?)其中T:equalable{/*…*/}
这相当于:
func gen<T>(arg: Optional<T>) where T : Equatable { /*...*/ }
func-gen(arg:Optional),其中T:equalable{/*…*/}
记住
泛型用于类型需求的可变部分。您需要的可选
是常量;这是可选的变量部分。因此,将可选性放在实际的func声明中,并将可选的what留给泛型
类型参数中的冒号表示子类型关系。类型T
不能是Optional
的子类型,因为Optional
是枚举-只有类和协议可以有子类型(分别是子类和一致类型)。同样,泛型也不是协变的,因此Optional
其中Foo
采用equalable
不是Optional
的子类型
如果我遗漏了什么,我很抱歉,但是您能在第一个示例中使用'arg:T'吗?
func gen<T>(arg: T?) where T : Equatable { /*...*/ }
func gen<T>(arg: Optional<T>) where T : Equatable { /*...*/ }