Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift通用功能总成<;T>;(arg:T)其中T:可选<;U>;,U:相等的_Swift_Generics - Fatal编程技术网

Swift通用功能总成<;T>;(arg:T)其中T:可选<;U>;,U:相等的

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

如何表达一个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 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 { /*...*/ }