Skip to content

Instantly share code, notes, and snippets.

@robtimp
Created May 21, 2015 20:01
Show Gist options
  • Save robtimp/b03003bb94212622b5f5 to your computer and use it in GitHub Desktop.
Save robtimp/b03003bb94212622b5f5 to your computer and use it in GitHub Desktop.
String Parsing (objc.io #9) example 3
// objc.io Issue #9
// February, 2014
// String Parsing by Chris Eidhof
//
// Example 3
// Swift version by Rob Hudson
import UIKit
let FormatError = 100
let MyErrorDomain = "io.objc.parsing"
let string = "backgroundColor = #ff0000\ntextColor = #0000ff"
func parse(string: String, inout error: NSError?) -> [String : String]? {
let scanner = NSScanner(string: string)
scanner.charactersToBeSkipped = NSCharacterSet.whitespaceCharacterSet()
let hexadecimalCharacterSet = NSCharacterSet(charactersInString: "0123456789abcdefABCDEF")
var result = [String : String]()
while !scanner.atEnd {
var key: NSString?
var value: NSString?
let letters = NSCharacterSet.letterCharacterSet()
let didScan = scanner.scanCharactersFromSet(letters, intoString: &key) &&
scanner.scanString("=", intoString: nil) &&
scanner.scanString("#", intoString: nil) &&
scanner.scanCharactersFromSet(hexadecimalCharacterSet, intoString: &value) &&
value?.length == 6
if !didScan {
let errorDetail = [NSLocalizedDescriptionKey : "Couldn't parse: \(scanner.scanLocation)"]
error = NSError(domain: MyErrorDomain, code: FormatError, userInfo: errorDetail)
return nil
}
if let key = key as? String, value = value as? String {
result[key] = value
}
scanner.scanCharactersFromSet(NSCharacterSet.newlineCharacterSet(), intoString: nil) // scan an optional newline
}
return result
}
var error: NSError?
parse(string, &error)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment