Split line on a separator with optional whitespace

Thank you very much for the ideas! So far I have ended up with this:

// XCTAssertNil(decodeKeyValuePair(""))
// XCTAssertNil(decodeKeyValuePair("foo"))
// XCTAssertNil(decodeKeyValuePair("foo "))
// XCTAssertEqual(decodeKeyValuePair("foo:"), ("foo", ""))
// XCTAssertEqual(decodeKeyValuePair("foo: "), ("foo", ""))
// XCTAssertEqual(decodeKeyValuePair("foo:bar"), ("foo", "bar"))
// XCTAssertEqual(decodeKeyValuePair("foo: bar"), ("foo", "bar"))
// XCTAssertEqual(decodeKeyValuePair("foo:  bar"), ("foo", "bar"))
// XCTAssertEqual(decodeKeyValuePair("foo: bar: baz"), ("foo", "bar: baz"))
func decodeKeyValuePair(_ str: String) -> (String, String)? {

    guard var sep = str.firstIndex(of: ":") else {
        return nil
    }

    let key = String(str.prefix(upTo: sep))

    // Skip spaces
    let last = str.index(before: str.endIndex)
    while let next = str.index(sep, offsetBy: 1, limitedBy: last), str[next] == " " {
        sep = next
    }

    let val = String(str.suffix(from: str.index(after: sep)))

    return (key, val)
}

Makes me wish for something like the parsing API mentioned before.