func split(every length:Int) -> [Substring] { guard length > 0 && length < count else { return [suffix(from:startIndex)] } return (0 ... (count - 1) / length).map { dropFirst($0 * length).prefix(length) } } func split(backwardsEvery length:Int) -> [Substring] { guard length > 0 && length < count else { return [suffix(from:startIndex)] } return (0 ... (count - 1) / length).map { dropLast($0 * length).suffix(length) }.reversed() }
tests:
XCTAssertEqual("0123456789".split(every:2), ["01", "23", "45", "67", "89"]) XCTAssertEqual("0123456789".split(backwardsEvery:2), ["01", "23", "45", "67", "89"]) XCTAssertEqual("0123456789".split(every:3), ["012", "345", "678", "9"]) XCTAssertEqual("0123456789".split(backwardsEvery:3), ["0", "123", "456", "789"]) XCTAssertEqual("0123456789".split(every:4), ["0123", "4567", "89"]) XCTAssertEqual("0123456789".split(backwardsEvery:4), ["01", "2345", "6789"])
source share