2016-08-16 6 views
2

Я хотел бы разбить строку на два символа в Swift. Поэтому после строки «df57g5df7g» я хотел бы получить массив [«df», «57», «g5», «df», «7g»]. Можно ли заставить итераторРазделить строку на два символа в Swift

for i in word.characters { 
print(i) 
} 

прыгать два символов, и получить acsess к следующему символу внутри цикла?

+4

См. Http://stackoverflow.com/questions/32212220/how-to-split-a-string-into-substrings-of-equal-length –

+1

Возможный дубликат [Swift: что такое правильный способ разделить a \ [String \], что приводит к \ [\ [String \] \] с заданным размером подмассива?] (http://stackoverflow.com/questions/26395766/swift-what-is-the-right-way- to-split-up-a-string-result-in-a-string-wi) –

+2

Похоже, что это может быть шестнадцатеричная строка, и задаться вопросом, намерено ли вы строить из нее NSData. Если это так, я обойду массив из двух символов шестнадцатеричных строк, а скорее пройду через эту строку и создаю 'NSData' напрямую. – Rob

ответ

5

Простой while петля:

let str = "df57g5df7g" 

var startIndex = str.startIndex 
var result = [String]() 

repeat { 
    let endIndex = startIndex.advancedBy(2, limit: str.endIndex) 
    result.append(str[startIndex..<endIndex]) 

    startIndex = endIndex 
} while startIndex < str.endIndex 

print(result) 

Или что-то более Swifty:

let result = 0.stride(to: str.characters.count, by: 2).map { i -> String in 
    let startIndex = str.startIndex.advancedBy(i) 
    let endIndex = startIndex.advancedBy(2, limit: str.endIndex) 
    return str[startIndex..<endIndex] 
} 
1

Это не может быть сликовое решение, но оно работает:

var word = "df57g5df7g" 

var pairsArray = [String]() 

while word.characters.count > 1 { 
    let firstCharacter = word.removeAtIndex(word.startIndex) 
    let secondCharacter = word.removeAtIndex(word.startIndex) 
    pairsArray.append("\(firstCharacter)\(secondCharacter)") 
} 

print(pairsArray) 

Результат :

["df", "57", "g5", "df", "7g"] 
1

Это лучшее решение, которое я видел, взятое с SwiftSequence library.

extension CollectionType { 
    public func chunk(n: Index.Distance) -> [SubSequence] { 
     var res: [SubSequence] = [] 
     var i = startIndex 
     var j: Index 
     while i != endIndex { 
      j = i.advancedBy(n, limit: endIndex) 
      res.append(self[i..<j]) 
      i = j 
     } 
     return res 
    } 
} 

let word = "df57g5df7g" 
let pairs = word.characters.chunk(2).map(String.init) 
print(pairs) //["df", "57", "g5", "df", "7g"] 

Вы можете увидеть это в действии here.

Смежные вопросы