Skip to content

Instantly share code, notes, and snippets.

public enum JSONValue {
case string(String)
case int(Int)
case double(Double)
case bool(Bool)
case object([String: JSONValue])
case array([JSONValue])
}
extension JSONValue: Encodable {
func parse(_ json: String) -> Any? {
return Bool(json) ?? Int(json) ?? Double(json) ?? parseString(json)
}
private func parseString(_ text: String) -> String? {
switch (text.first, text.last) {
case ("\""?, "\""?): return ""
default: return nil
}
}
func parse(_ json: String) -> Any? {
return Bool(json) ?? Int(json) ?? Double(json) ?? ""
}
func testEmptyString() {
assert("\"\"", parsesTo: "")
}
func assert<T: Equatable>(_ json: String, parsesTo target: T) {
guard let parsed = parser.parse(json) as? T else { XCTFail("Parsed item \(json) is not of type \(T.self)"); return }
XCTAssertEqual(parsed, target)
}
func assertNil(_ json: String) {
XCTAssertNil(parser.parse(json))
}
class JSONParser {
func parse(_ json: String) -> Any? {
return Bool(json) ?? Int(json) ?? Double(json)
}
}
func testDouble() {
XCTAssertEqual(parser.parse("0.0") as! Double, 0)
}