Skip to content

Instantly share code, notes, and snippets.

@sahara-ooga
Last active March 17, 2018 12:38
Show Gist options
  • Save sahara-ooga/686e5135e19c958ee75be4b2059e0e30 to your computer and use it in GitHub Desktop.
Save sahara-ooga/686e5135e19c958ee75be4b2059e0e30 to your computer and use it in GitHub Desktop.
再帰的なEnumを、structに変換する
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