如何在Swift 2.2+中处理String的每个双字符子串?

时间:2016-03-22 13:11:30

标签: swift swift2

不再支持C风格的for循环,那么这个旧的十六进制解码器在Swift 2.2+中会是什么样子?

let data = NSMutableData(capacity: trimmedString.characters.count / 2)
for var index = trimmedString.startIndex; index < trimmedString.endIndex; index = index.successor().successor() {
    let byteString = trimmedString.substringWithRange(Range<String.Index>(start: index, end: index.successor().successor()))
    let num = UInt8(byteString.withCString { strtoul($0, nil, 16) })
    data!.appendBytes([num] as [UInt8], length: 1)
}

2 个答案:

答案 0 :(得分:2)

使用stride

for index in 0.stride(through: trimmedString.characters.count, by: 2) {
    // ...
}

要从Range创建index,请使用字符串的startIndex并将其前进。例如:

trimmedString.startIndex.advancedBy(index)
trimmedString.startIndex.advancedBy(index).successor().successor()

等。只需检查以确保您没有使用successor()超出界限。

答案 1 :(得分:0)

这样的大多数循环可以使用stride方法实现,但String.CharacterView.Index不是Strideable。您可以使用enumerate方法在字符串索引旁边创建基于整数的索引,然后使用where子句仅每秒执行一次循环:

for (i, index) in trimmedString.characters.indices.enumerate() where number % 2 == 0 {
    print(trimmedString.characters[i])
}