Last active
March 17, 2018 12:38
-
-
Save sahara-ooga/686e5135e19c958ee75be4b2059e0e30 to your computer and use it in GitHub Desktop.
再帰的なEnumを、structに変換する
This file contains hidden or 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
indirect enum TreeEnum{ | |
case leaf(id:String, body:String) | |
case multiPart(id:String, body:[TreeEnum]) | |
case message(id:String, body:TreeEnum) | |
} | |
struct Root{ | |
let id:String | |
let body:String? | |
let parts:[Root]? | |
} | |
//struct Part<T>{//TはRootかPart | |
// let parentPart:T | |
// let parts:[Part]? | |
// | |
// let id:String | |
// let body:String? | |
//} | |
//: Compose Enums | |
let leaf1 = TreeEnum.leaf(id: "leaf1", body: "body1") | |
let leaf2 = TreeEnum.leaf(id: "leaf2", body: "body2") | |
let leaf3 = TreeEnum.leaf(id: "leaf3", body: "body3") | |
let leaf4 = TreeEnum.leaf(id: "leaf4", body: "body4") | |
let node = TreeEnum.multiPart(id: "node", body: [leaf2,leaf3,leaf4]) | |
let root = TreeEnum.multiPart(id: "root", body: [leaf1, node]) | |
//: Translate enum to structs | |
func translate(treeEnum:TreeEnum)->Root{ | |
switch treeEnum { | |
case let .leaf(id,body): | |
return Root(id: id, body: body, parts: nil) | |
case let .multiPart(id, enumArray): | |
return Root(id: id, | |
body: nil, | |
parts: enumArray.map{translate(treeEnum: $0)}) | |
case let .message(id,treeEnum): | |
return Root(id:id, | |
body:nil, | |
parts: [translate(treeEnum:treeEnum)]) | |
} | |
} | |
let translatedRoot = translate(treeEnum: root) | |
//: do some job with translated struct | |
extension Root{ | |
var description:String{ | |
var string = "" | |
//まず自分自身の情報を追加 | |
string.append("id: " + self.id + ", body: " + (self.body ?? "parts") + "\n") | |
//partsが存在すれば、partsの情報を追加 | |
if let parts = self.parts{ | |
let partsString = parts.reduce(""){(result ,part) in | |
result + part.description | |
} | |
string.append(partsString) | |
} | |
return string | |
} | |
} | |
print(translatedRoot.description) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment