Last active
December 1, 2016 14:53
-
-
Save mosluce/1acc04528a340daacdd0ba6e8b7ff299 to your computer and use it in GitHub Desktop.
Protocol Oriented 練習:Deserialize JSON and XML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
struct User { | |
var username: String? | |
var password: String? | |
} | |
extension User { | |
init(_ node: NodeAccessable) { | |
self.username = node.child("username").string | |
self.password = node.child("password").string | |
} | |
} | |
/** | |
Example: | |
//json | |
let user: User = User(json) | |
//or xml | |
let user: User = User(xml) | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import SwiftyJSON | |
import SWXMLHash | |
protocol NodeAccessable { | |
func child(_ index: Int) -> NodeAccessable | |
func child(_ key: String) -> NodeAccessable | |
var string: String? { get } | |
var bool: Bool? { get } | |
var number: NSNumber? { get } | |
} | |
extension JSON : NodeAccessable { | |
func child(_ index: Int) -> NodeAccessable { | |
return self[index] | |
} | |
func child(_ key: String) -> NodeAccessable { | |
return self[key] | |
} | |
//string, bool, number SwiftyJSON 本來就有實作,可省略 | |
} | |
extension XMLIndexer : NodeAccessable { | |
func child(_ index: Int) -> NodeAccessable { | |
return self[index] | |
} | |
func child(_ key: String) -> NodeAccessable { | |
return self[key] | |
} | |
var string: String? { | |
if let text = self.element?.text { | |
return text | |
} | |
return nil | |
} | |
var bool: Bool? { | |
if let text = self.element?.text { | |
return NSString(string: text).boolValue | |
} | |
return nil | |
} | |
var number: NSNumber? { | |
if let text = self.element?.text { | |
if let n = Int(text) { | |
return NSNumber(value: n) | |
} | |
if let n = Float(text) { | |
return NSNumber(value: n) | |
} | |
if let n = Double(text) { | |
return NSNumber(value: n) | |
} | |
} | |
return nil | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment