2016-12-28 98 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) 
// [["один"], ["один", "два", "три"], ["семь"]]