Swift Generic func gen <t>(arg:T)其中T:Optional <u>,U:Equatable

时间:2017-02-07 00:48:18

标签: swift generics

如何表达限制TOptional<Equatable>的Swift泛型函数?

我已经尝试了以下内容,结果是错误。

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

  • 类型&#39; T&#39;限制为非协议类型&#39;可选&#39;

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

  • 无法专门化非通用类型&#39; OptionalProtocol&#39;

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

  • 类型&#39; T&#39;限制为非协议类型&#39;可选&#39;
  • 通用参数&#39; U&#39;未在函数签名中使用

感谢。

修改

我正在做类似

的事情
if let a = arg, let b = argb
    return a==b

事实证明,我的错误根本不在模板中,只是我正在使用的对象实际上并不是Equatable。我想我认为Swift会为一个结构生成==,结构中的元素本身都是==&#39;能够,但事实并非如此。下次我会知道错误Expression type 'Bool' is ambiguous without more context建议的内容。

2 个答案:

答案 0 :(得分:4)

这应该有效:

func gen<T>(arg: T?) where T : Equatable { /*...*/ }

这相当于:

func gen<T>(arg: Optional<T>) where T : Equatable { /*...*/ }

记住,

  1. 泛型是针对您的类型要求的可变部分。您需要Optional是不变的;它是变量的可选 - 部分。因此,将可选性置于实际的func声明中,并保留可选的用于泛型的

  2. 类型参数中的冒号表示子类型关系。类型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