我有数组数组 - var days: [[Int]] = [[1], [1,2,3], [7]]
我想通过 String
将 Int
转换为名称并将其添加到新数组 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
}
}
但我在每个案例附近都看到了错误:
Expression pattern of type '[Int]' cannot match values of type '[Int]'
我的错误是什么?谢谢!
最佳答案
更新条件一致性已在 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)
// [["один"], ["один", "два", "три"], ["семь"]]
关于arrays - 快速切换转换时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359984/