【问题标题】:Getting error: String is not convertible to 'T'出现错误:字符串不能转换为 'T'
【发布时间】:2021-01-08 21:10:56
【问题描述】:

这段代码可以正常编译:

class Numbers {
    func operateOn<T>(_ num1: T, _ num2: T, do task: (T, T) -> ()) {
        task(num1, num2)
    }
}

let n = Numbers()
n.operateOn(1,2) {
    print(($0 + $1) * 10)
}

n.operateOn("l","ll") {
    print(($0 + $1))
}

但对于以下代码无法编译。

func process<T> (add: String, completion: (T) -> () ) {
    completion("k") // ERROR
}

但我收到以下错误:

'String' 不能转换为 'T'

我尝试传递Int,但又遇到另一个错误:

'Int' 不能转换为 'T'

IntString 不能满足没有任何约束的通用要求吗?!

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    问题是您的代码需要适用于任何T。例如。如果TInt 那么completion 的类型是(Int) -&gt; (),调用是完全合法的

    n.process<Int>("") { $0 + 1 }
    

    completion("k") 必须做"k" + 1 这没有意义。

    这在基本上任何具有泛型的语言中都是相同的(C++ 不同,因为它使用模板来实现相同的目的)。

    【讨论】:

      【解决方案2】:

      IntString 不能满足以下通用要求 没有任何限制?!

      当然可以。但这不是编译器给你错误的原因。

      想一想,如果你在函数体本身约束一个通用函数/参数会发生什么?!它将不再是通用函数!

      想象一下,如果您这样编写 operateOn 函数:

      class Numbers {
          func operateOn<T>(_ num1: T, _ num2: T, do task: (T, T) -> ()) {
              task("k", num2) // add two strings
          }
      }
      

      你会说T 是通用的吗?或者它的类型是String?如果您将其设为String,那么num2 可以成为它想要的任何泛型类型吗?不能!

      如果它是String 类型,则它不再是通用。由于编译器不允许它会抛出该错误。

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        相关资源
        最近更新 更多