【问题标题】:Cannot match values of type无法匹配类型的值
【发布时间】:2016-12-12 22:52:53
【问题描述】:

我刚开始使用 Swift 3,我正在将 Rails 项目转换为 swift(我学习时的辅助项目)

相当简单,我有一个 Rails 语句正在转换,我在 Xcode 中遇到很多红色错误:

let startingPoint: Int = 1
let firstRange: ClosedRange = (2...10)
let secondRange: ClosedRange = (11...20)

func calc(range: Float) -> Float {
  switch range {
    case startingPoint:
     return (range - startingPoint) * 1 // or 0.2
    case firstRange:
     return // code
    default:
     return //code
  }
}

calc 将具有 IntFloat 值:1010.50

错误是:

ClosedRange 类型的表达式模式不能匹配 Float 类型的值

二元运算符 - 不能应用于 Float 和 Int 类型的操作数

我了解这些错误,但我不知道要搜索什么来纠正它。请给我指出正确的方向好吗?

【问题讨论】:

    标签: swift swift3


    【解决方案1】:

    Swift 是强类型的。每当您使用变量或将某些内容作为函数参数传递时,Swift 都会检查它的类型是否正确。您不能将字符串传递给需要整数等的函数。Swift 在编译时进行检查(因为它是静态类型的)。​​

    要遵守该规则,请尝试将您的代码更改为:

    let startingPoint: Float = 1
    let firstRange: ClosedRange<Float> = (2...10)
    let secondRange: ClosedRange<Float> = (11...20)
    
    func calc(range: Float) -> Float {
        switch range {
        case startingPoint:
            return (range - startingPoint) * 1 // or 0.2
        case firstRange:
        return 1.0 // 1.0 is just an example, but you have to return Float since that is defined in the method
        default:
            return 0.0 // 0.0 is just an example, put whatever you need here
        }
    }
    

    【讨论】:

    • 嗨JPetric,我得到fatal error: Can't form Range with upperBound &lt; lowerBound for firstRangeswitch
    • 没关系。我收到错误,因为我的范围使用let。应该使用var
    【解决方案2】:

    对于第一个错误,您可能希望将 ClosedRange 指定为 Floats 类型。类似于:

    let firstRange: ClosedRange&lt;Float&gt; = (2...10)

    对于第二个错误,问题是您试图将 Float (range:Float) 与 Int (startingPoint) 进行比较。所以我建议你也将startingPoint变量转换为浮点数。

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 2020-02-19
      相关资源
      最近更新 更多