【问题标题】:Error in switch convert in swiftswift中的开关转换错误
【发布时间】:2016-12-28 10:25:09
【问题描述】:

我有数组 - var days: [[Int]] = [[1], [1,2,3], [7]] 我想将Int 转换为String 的名称并将其添加到新数组arrayOfStringDays 中。我的代码:

var days: [[Int]] = [[1], [1,2,3], [7]]    
var arrayOfStringDays = [[String]]() 

            for i in 0..<days.count {

                switch days[i] {
                    case [1]:
                        arrayOfStringDays.append(["one"])
                    case [1,2,3]:
                        arrayOfStringDays.append(["one, two, three"])
                    case [7]:
                        arrayOfStringDays.append(["seven"])
                    default:
                        break
                } 
            }

但我在每个案例附近都看到错误:

“[Int]”类型的表达式模式不能匹配“[Int]”类型的值

我的错误是什么?谢谢!

【问题讨论】:

  • 您的问题已在 Swift 4.1 / Xcode 9.3 中解决。

标签: arrays swift loops switch-statement


【解决方案1】:

更新:条件一致性已在 Swift 4.1 中实现, 特别是数组(和其他一些集合类型)符合 Equatable 如果他们的元素这样做。

您的代码现在在 Xcode 9.3 中编译没有问题。


switch 语句使用“模式匹配”运算符

public func ~=<T : Equatable>(a: T, b: T) -> Bool

将给定值与各种情况进行比较。 问题是Array 不符合 Equatable,即使数组元素是Equatable。 (这将在 Swift 4 中改变,请参阅 SE-0143 Conditional conformances.)

我可以建议一个不同的解决方案吗? 用于转换嵌套数组的嵌套 map 和数字格式化程序 使用“拼写”样式将数字转换为单词:

let days: [[Int]] = [[1], [1,2,3], [7]]

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.numberStyle = .spellOut

let arrayOfStringDays = days.map {
    $0.map { formatter.string(from: $0 as NSNumber) ?? String($0) }
}

print(arrayOfStringDays)
// [["one"], ["one", "two", "three"], ["seven"]]

您还可以将格式化程序区域设置为不同的语言, 或者使用默认值获取用户默认的结果 语言。示例:

formatter.locale = Locale(identifier: "ru")
// ...
print(arrayOfStringDays)
// [["один"], ["один", "два", "три"], ["семь"]]

【讨论】:

    【解决方案2】:

    我不知道确切的错误,但您可以像这样对 [[Int]] 进行转换。

    var days: [[Int]] = [[1], [1,2,3], [7]]
    
    let numberStr = ["Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"]
    
    let daysInString = days.map { (intList) -> [String] in
        return intList.map({ (intValue) -> String in
            return numberStr[intValue]
        })
    }
    print(daysInString)
    
    // Output : [["One"], ["One", "Two", "Three"], ["Seven"]]
    

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多