如何将字符串拆分为相等长度的子字符串

ysh*_*lov 17 string swift swift2

所以

split("There are fourty-eight characters in this string", 20)
Run Code Online (Sandbox Code Playgroud)

应该回来

["There are fourty-eig", "ht characters in thi","s string"]
Run Code Online (Sandbox Code Playgroud)

如果我使currentIndex = string.startIndex,然后尝试进一步提前()它比string.endIndex,我得到"致命错误:不能增加endIndex"之前我检查我的currentIndex <string.endIndex所以下面的代码没有'工作

var string = "12345"
var currentIndex = string.startIndex
currentIndex = advance(currentIndex, 6)
if currentIndex > string.endIndex {currentIndex = string.endIndex}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ent 25

我刚刚在SO上回答了类似的问题,并认为我可以提供更简洁的解决方案:

斯威夫特2

func split(str: String, _ count: Int) -> [String] {
    return 0.stride(to: str.characters.count, by: count).map { i -> String in
        let startIndex = str.startIndex.advancedBy(i)
        let endIndex   = startIndex.advancedBy(count, limit: str.endIndex)
        return str[startIndex..<endIndex]
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

func split(_ str: String, _ count: Int) -> [String] {
    return stride(from: 0, to: str.characters.count, by: count).map { i -> String in
        let startIndex = str.index(str.startIndex, offsetBy: i)
        let endIndex   = str.index(startIndex, offsetBy: count, limitedBy: str.endIndex) ?? str.endIndex
        return str[startIndex..<endIndex]
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

更改为while循环以提高效率,并按流行请求制作String的扩展名:

extension String {
    func split(by length: Int) -> [String] {
        var startIndex = self.startIndex
        var results = [Substring]()

        while startIndex < self.endIndex {
            let endIndex = self.index(startIndex, offsetBy: length, limitedBy: self.endIndex) ?? self.endIndex
            results.append(self[startIndex..<endIndex])
            startIndex = endIndex
        }

        return results.map { String($0) }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*mbo 10

只需一次通过字符序列即可轻松解决此问题:

Swift 2.2

extension String {
    func splitByLength(length: Int) -> [String] {
        var result = [String]()
        var collectedCharacters = [Character]()
        collectedCharacters.reserveCapacity(length)
        var count = 0

        for character in self.characters {
            collectedCharacters.append(character)
            count += 1
            if (count == length) {
                // Reached the desired length
                count = 0
                result.append(String(collectedCharacters))
                collectedCharacters.removeAll(keepCapacity: true)
            }
        }

        // Append the remainder
        if !collectedCharacters.isEmpty {
            result.append(String(collectedCharacters))
        }

        return result
    }
}

let foo = "There are fourty-eight characters in this string"
foo.splitByLength(20)
Run Code Online (Sandbox Code Playgroud)

Swift 3.0

extension String {
    func splitByLength(_ length: Int) -> [String] {
        var result = [String]()
        var collectedCharacters = [Character]()
        collectedCharacters.reserveCapacity(length)
        var count = 0

        for character in self.characters {
            collectedCharacters.append(character)
            count += 1
            if (count == length) {
                // Reached the desired length
                count = 0
                result.append(String(collectedCharacters))
                collectedCharacters.removeAll(keepingCapacity: true)
            }
        }

        // Append the remainder
        if !collectedCharacters.isEmpty {
            result.append(String(collectedCharacters))
        }

        return result
    }
}

let foo = "There are fourty-eight characters in this string"
foo.splitByLength(20)
Run Code Online (Sandbox Code Playgroud)

由于String是一种非常复杂的类型,因此根据视图,范围和索引可能具有不同的计算成本.这些细节仍在不断发展,因此上述一次性解决方案可能是更安全的选择.

希望这可以帮助


Wuj*_*ujo 9

Swift 5,基于@Ondrej Stocek 解决方案

extension String {
    func components(withMaxLength length: Int) -> [String] {
        return stride(from: 0, to: self.count, by: length).map {
            let start = self.index(self.startIndex, offsetBy: $0)
            let end = self.index(start, offsetBy: length, limitedBy: self.endIndex) ?? self.endIndex
            return String(self[start..<end])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ond*_*cek 5

基于“代码不同”的字符串扩展答案:

迅捷3/4/5

extension String {
    func components(withLength length: Int) -> [String] {
        return stride(from: 0, to: self.characters.count, by: length).map {
            let start = self.index(self.startIndex, offsetBy: $0)
            let end = self.index(start, offsetBy: length, limitedBy: self.endIndex) ?? self.endIndex
            return self[start..<end]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

let str = "There are fourty-eight characters in this string"
let components = str.components(withLength: 20)
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您想将字符串拆分为特定长度,则可以使用以下字符串扩展,但也要考虑单词:

斯威夫特4:

func splitByLength(_ length: Int, seperator: String) -> [String] {
    var result = [String]()
    var collectedWords = [String]()
    collectedWords.reserveCapacity(length)
    var count = 0
    let words = self.components(separatedBy: " ")

    for word in words {
        count += word.count + 1 //add 1 to include space
        if (count > length) {
            // Reached the desired length

            result.append(collectedWords.map { String($0) }.joined(separator: seperator) )
            collectedWords.removeAll(keepingCapacity: true)

            count = word.count
            collectedWords.append(word)
        } else {
            collectedWords.append(word)
        }
    }

    // Append the remainder
    if !collectedWords.isEmpty {
        result.append(collectedWords.map { String($0) }.joined(separator: seperator))
    }

    return result
}
Run Code Online (Sandbox Code Playgroud)

这是对Matteo Piombo上面答案的修改。

用法

let message = "Here is a string that I want to split."
let message_lines = message.splitByLength(18, separator: " ")

//output: [ "Here is a string", "that I want to", "split." ]
Run Code Online (Sandbox Code Playgroud)


GoZ*_*ner 2

endIndex不是有效的索引;它比有效范围大 1。