Skip to content

Instantly share code, notes, and snippets.

@mosluce
Last active December 1, 2016 14:53
Show Gist options
  • Save mosluce/1acc04528a340daacdd0ba6e8b7ff299 to your computer and use it in GitHub Desktop.
Save mosluce/1acc04528a340daacdd0ba6e8b7ff299 to your computer and use it in GitHub Desktop.
Protocol Oriented 練習:Deserialize JSON and XML
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)
*/
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