Skip to content

Instantly share code, notes, and snippets.

@alexkent
Created April 25, 2016 06:52
Show Gist options
  • Save alexkent/af8794e0a1032bddf7e8d67fd530054a to your computer and use it in GitHub Desktop.
Save alexkent/af8794e0a1032bddf7e8d67fd530054a to your computer and use it in GitHub Desktop.
import Foundation
let string = "e5cfb500"
for var index = string.startIndex; index < string.endIndex; index = index.advancedBy(2) {
let rangeOfCharacterPair = Range<String.Index>(index..<index.advancedBy(2))
let characterPair = string.substringWithRange(rangeOfCharacterPair)
print(characterPair)
}
@simme
Copy link

simme commented Apr 25, 2016

Maybe something like this:

let str = "ffae00"
var start = str.startIndex
let end = str.endIndex

while start != end {
    let to = start.advancedBy(2, limit: str.endIndex)
    let characterPair = str.substringWithRange(start..<to)
    start = to
}

@simme
Copy link

simme commented Apr 25, 2016

Or maybe even:

extension String {
    func chunked(size: Int) -> [String] {
        var start = self.startIndex
        let end = self.endIndex
        var chunks = [String]()
        while start != end {
            let to = start.advancedBy(size, limit: self.endIndex)
            chunks.append(self.substringWithRange(start..<to))
            start = to
        }
        return chunks
    }
}

str.chunked(2)

@paoloboschini
Copy link

paoloboschini commented Apr 25, 2016

Maybe

var s = "e5cfb500"
let stride1 = Array(0.stride(to: s.characters.count, by: 2))
let stride2 = Array(1.stride(to: s.characters.count, by: 2))
for i in 0..<s.characters.count / 2 {
    let c1 = s[s.startIndex.advancedBy(stride1[i])]
    let c2 = s[s.startIndex.advancedBy(stride2[i])]
    print(String(c1) + String(c2))
}

@stefanlindbohm
Copy link

What about this? Ranges and maps are GREAT :). Also, this uses Swift's String subscript instead of substringWithRange dropping the need for Foundation.

let string = "e5cfb500"

let pairsCount = string.characters.count / 2
let pairs = (0..<pairsCount).map { pairNumber -> String in
    let pairStartPosition = string.startIndex.advancedBy(pairNumber * 2)
    return string[pairStartPosition...pairStartPosition.advancedBy(1)]
}

for pair in pairs {
    print(pair)
}

@stefanlindbohm
Copy link

Wait a second, I didn't see @paoloboschini's comment using stride. That's clever! How about this even?

let string = "e5cfb500"

let pairs = 0.stride(to: string.characters.count, by: 2).map { pairStartPosition -> String in
    return string[string.startIndex.advancedBy(pairStartPosition)...string.startIndex.advancedBy(pairStartPosition + 1)]
}

for pair in pairs {
    print(pair)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment