将Swift字符串剪切成2个字母的字符串的最佳方法是什么?

时间:2015-12-15 01:36:45

标签: swift nsstring nsrange

我需要将一个字符串拆分成两个字母的部分。喜欢“朋友” - >“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个字母字符串的最佳方法是什么?

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"]