将String拆分为具有特定长度的组

kat*_*000 7 string split divide swift

如何将StringSwift中的给定分成给定长度的组,从右到左阅读?

例如,我有串1234567893.的和组的长度字符串应该被分为3组:123,456,789.字符串1234567将分为1,234,567

那么,你能在Swift中编写一些不错的代码吗:

func splitedString(string: String, length: Int) -> [String] {

}
Run Code Online (Sandbox Code Playgroud)

BTW试过功能split(),但据我所知它只能找到一些符号

ste*_*tef 7

雨燕4

我改编了Cafedeichi 给出的答案,根据函数参数从左到右或从右到左操作,因此它更通用。

extension String {
    /// Splits a string into groups of `every` n characters, grouping from left-to-right by default. If `backwards` is true, right-to-left.
    public func split(every: Int, backwards: Bool = false) -> [String] {
        var result = [String]()

        for i in stride(from: 0, to: self.count, by: every) {
            switch backwards {
            case true:
                let endIndex = self.index(self.endIndex, offsetBy: -i)
                let startIndex = self.index(endIndex, offsetBy: -every, limitedBy: self.startIndex) ?? self.startIndex
                result.insert(String(self[startIndex..<endIndex]), at: 0)
            case false:
                let startIndex = self.index(self.startIndex, offsetBy: i)
                let endIndex = self.index(startIndex, offsetBy: every, limitedBy: self.endIndex) ?? self.endIndex
                result.append(String(self[startIndex..<endIndex]))
            }
        }

        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

"abcde".split(every: 2)                     // ["ab", "cd", "e"]
"abcde".split(every: 2, backwards: true)    // ["a", "bc", "de"]

"abcde".split(every: 4)                     // ["abcd", "e"]
"abcde".split(every: 4, backwards: true)    // ["a", "bcde"]
Run Code Online (Sandbox Code Playgroud)


Cod*_*ent 3

只是为了将我的参赛作品添加到这个非常拥挤的竞赛中(SwiftStub):

func splitedString(string: String, length: Int) -> [String] {
    var result = [String]()

    for var i = 0; i < string.characters.count; i += length {
        let endIndex = string.endIndex.advancedBy(-i)
        let startIndex = endIndex.advancedBy(-length, limit: string.startIndex)
        result.append(string[startIndex..<endIndex])
    }

    return result.reverse()
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您感觉功能齐全:

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