2016-12-28 96 views
1

转换我有数组的数组 - var days: [[Int]] = [[1], [1,2,3], [7]] ,我想通过StringInt转换为名称,并在新的数组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]' 不能匹配类型的值

我的错误是什么?谢谢!

回答

1

我不知道确切的错误,但你可以做这样的[[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"]] 
4

switch语句使用“模式匹配”运营商

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

来比较不同的情况下,给定值。 问题是即使数组元素是EquatableArray也不符合 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) 
// [["один"], ["один", "два", "три"], ["семь"]]