我需要将一个字符串拆分成两个字母的部分。喜欢“朋友” - >“fr”“ie”“nd”。(好吧,这是我将HEX字符串更改为Uint8数组的一步)
我的代码是
for i=0; i<chars.count/2; i++ {
let str = input[input.startIndex.advancedBy(i*2)..<input.startIndex.advancedBy(i*2+1)]
bytes.append(UInt8(str,radix: 16)!)
}
但我不知道为什么我不能使用Range来做这个分裂。我不知道当i * 2 + 1大于字符串的长度时会发生什么。那么将Swift字符串切割成2个字母字符串的最佳方法是什么?
答案 0 :(得分:3)
您的范围无效,因为您需要使用...
代替..<
。
let input = "ff103"
var bytes = [UInt8]()
let strlen = input.characters.count
for i in 0 ..< (strlen + 1)/2 {
let str = input[input.startIndex.advancedBy(i*2)...input.startIndex.advancedBy(min(strlen - 1, i*2+1))]
bytes.append(UInt8(str,radix: 16) ?? 0)
}
print(bytes) // [255, 16, 3]
这是将字符串拆分为双字母字符串的另一种方法。 advancedBy()
是一项昂贵的O(n)操作,因此此版本会跟踪start
,并且每个循环只需前进2
,{{1 }}基于end
:
start
替代答案:
使用范围可能有点过分。只需将字符添加到数组中,然后从这些字符中创建let input = "friends"
var strings = [String]()
let strlen = input.characters.count
var start = input.startIndex
let lastIndex = strlen > 0 ? input.endIndex.predecessor() : input.startIndex
for i in 0 ..< (strlen + 1)/2 {
start = i > 0 ? start.advancedBy(2) : start
let end = start < lastIndex ? start.successor() : start
let str = input[start...end]
strings.append(str)
}
print(strings) // ["fr", "ie", "nd", "s"]
:
String
以下是制作let input = "friends"
var strings = [String]()
var newchars = [Character]()
for c in input.characters {
newchars.append(c)
if newchars.count == 2 {
strings.append(String(newchars))
newchars = []
}
}
if newchars.count > 0 {
strings.append(String(newchars))
}
print(strings) // ["fr", "ie", "nd", "s"]
的新版本:
[UInt8]
根据@LeoDabus的回答,我们可以使用一个返回任意长度子串的方法和一个返回let input = "ff103"
var bytes = [UInt8]()
var newchars = [Character]()
for c in input.characters {
newchars.append(c)
if newchars.count == 2 {
bytes.append(UInt8(String(newchars), radix: 16) ?? 0)
newchars = []
}
}
if newchars.count > 0 {
bytes.append(UInt8(String(newchars), radix: 16) ?? 0)
}
print(bytes) // [255, 16, 3]
的计算属性进行扩展:
[UInt8]
答案 1 :(得分:1)
另一种选择只是为了好玩:
extension String {
var pairs:[String] {
var result:[String] = []
let chars = Array(characters)
for index in 0.stride(to: chars.count, by: 2) {
result.append(String(chars[index..<min(index+2, chars.count)]))
}
return result
}
}
let input = "friends"
let pairs = input.pairs
print(pairs) // ["fr", "ie", "nd", "s"]