不再支持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)
}
答案 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])
}