什么';将Swift字符串剪成两个字母字符串的最佳方法是什么?

什么';将Swift字符串剪成两个字母字符串的最佳方法是什么?,swift,nsstring,nsrange,Swift,Nsstring,Nsrange,我需要把一根绳子分成两个字母的碎片。比如“friend”->“fr”“ie”“nd”。(好的,这是我将十六进制字符串更改为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,r

我需要把一根绳子分成两个字母的碎片。比如“friend”->“fr”“ie”“nd”。(好的,这是我将十六进制字符串更改为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)!)
    }

对于i=0;i您的范围不起作用,因为您需要使用
..
而不是
。您的范围不起作用,因为您需要使用
..
而不是
。另一个只是为了好玩的选项:

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"]
扩展字符串{
变量对:[字符串]{
变量结果:[字符串]=[]
设chars=数组(字符)
对于0.stride中的索引(to:chars.count,by:2){

result.append(字符串(chars[index..另一个有趣的选项:

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"]
扩展字符串{
变量对:[字符串]{
变量结果:[字符串]=[]
设chars=数组(字符)
对于0.stride中的索引(to:chars.count,by:2){


结果。追加(字符串(字符)[索引..我的错误!因此此advancedBy是安全的,不会出现溢出问题?按照您为
循环编写
的方式,将永远无法到达最后一个奇数字符。这是因为
input.characters.count/2
是整数除法,并删除余数。例如,如果字符串中有3个字符,则循环将l仅运行一次。如果您尝试将索引向前推进到字符串末尾,您将得到
致命错误:无法增加endIndex
。您希望如何处理奇数长度字符串中的最后一个字符?在这里,我可以确保始终将偶数长度字符串发送到此函数。但如果需要处理奇数长度字符串,我只能通过添加一些额外的代码来检查我的
for
循环是否安全。我的错误!所以这个advancedBy是安全的,不会出现溢出问题?按照你为
for
循环编写
的方式,最后一个奇数字符永远不会到达。这是因为
input.characters.count/2
是整数除法,并且会删除剩余的字符der.例如,如果字符串中有3个字符,循环将只运行一次。如果您尝试将索引提前到字符串末尾,您将得到
致命错误:无法增加endIndex
。您希望如何处理奇数长度字符串中的最后一个字符?在这里,我可以确保始终将偶数长度字符串发送到该字符串但是如果我需要处理奇数长度的字符串,我只能通过添加一些额外的代码来检查
for
循环是否安全。这很棘手。但是
0.stride(to:chars.count,by:2)有什么作用呢
mean@zhongdian它将从0增加到字符数。计数增加2。这应该是问题标题的公认答案。如何:
result.append(String(chars[index..
这很棘手。但是
0.跨步(to:chars.count,by:2)是什么呢
mean@zhongdian它将从0变为字符。计数增加2个,Leo。这应该是问题标题的公认答案。如何:
result.append(字符串(chars[index..
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"]
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]
extension String {
    func substringsOfLength(length: Int) -> [String] {
        if length < 1 { return [] }

        var result:[String] = []
        let chars = Array(characters)
        for index in 0.stride(to: chars.count, by: length) {
            result.append(String(chars[index ..< min(index+length, chars.count)]))
        }
        return result
    }

    var toUInt8: [UInt8] {
        var result:[UInt8] = []
        let chars = Array(characters)
        for index in 0.stride(to: chars.count, by: 2) {
            let str = String(chars[index ..< min(index+2, chars.count)])
            result.append(UInt8(str, radix: 16) ?? 0)
        }
        return result
    }
}

let input = "friends"
let str2 = input.substringsOfLength(2)  // ["fr", "ie", "nd", "s"]
let str0 = input.substringsOfLength(0)  // []
let str3 = input.substringsOfLength(3)  // ["fri", "end", "s"]

let bytes = "ff107".toUInt8  // [255, 16, 7]
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"]