【问题标题】:"Generic parameter 'T' could not be inferred" error when overloading methods重载方法时出现“无法推断通用参数'T'”错误
【发布时间】:2023-03-14 14:46:01
【问题描述】:

我有这个带有 2 个构造函数的小枚举。当我尝试使用Int 参数进行初始化时,我收到"Generic parameter 'T' could not be inferred" 错误。

import UIKit

public enum Result<T> {

case Success(T)
case Failure(Int)

   init( any: T) {
       self  = .Success(any)
   }

   init( number: Int) {
       self  = .Failure(number)
   }
}

let a = Result(any: "A String")
print(a)

let b = Result(number: 1)
print(b)

有没有办法从 T 中排除 Int 或以某种方式优先考虑第二个初始化程序?

在 XCode 7.3.1 上测试。

【问题讨论】:

  • 编译器是对的。 Result(number: 1) 中的 T 是什么?

标签: xcode swift generics enums


【解决方案1】:

问题不在于它错误地使用了哪个构造函数,问题在于它需要在您输入 Result(number: 1) 时立即知道 T 将是什么类型。它不能将它作为通配符 T 留给运行时使用,它必须在编译时解析。

所以你可以这样做:

let b = Result<String>(number: 1) //letting it know that T would be a String.

这很重要的原因是因为 -- 假设你想把一堆 Result 放在一个数组中......嗯......你不能把 Result-Int 和 Result-String 放在同一个数组中(除非该数组的类型是 Any),因为它非常类似于将 Int 和 String 放入 Array 中。简而言之,Result 不仅仅是一种类型,它是一组类型的集合。

【讨论】:

    【解决方案2】:

    实际上,在您的示例中,不可能从表达式 Result(number: 1) 推断类型参数 T

    您需要向编译器提供所有必要的信息。看看这个稍作修改的例子:

    public enum Result<T> {
    
        case Success(T)
        case Failure(Int)
    
    }
    
    let a = Result.Success("A String")
    print(a)
    
    let b: Result<String> = .Failure(1)
    print(b)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2018-05-19
      相关资源
      最近更新 更多