-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathContents.swift
84 lines (57 loc) · 1.63 KB
/
Contents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//: [Previous](@previous)
import Foundation
class Node<T: Equatable> {
// MARK: - Properties
weak var parent: Node?
var value: T
var children: [Node<T>] = []
// MARK: - Initializers
init(value: T) {
self.value = value
}
// MARK: - Methods
func insert(child: Node) {
children.append(child)
child.parent = self
}
func search(value: T) -> Node? {
if value == self.value {
return self
}
for child in children {
if let foundChild = child.search(value: value) {
return foundChild
}
}
return nil
}
}
extension Node: CustomStringConvertible, CustomDebugStringConvertible {
// MARK: - Overriden properties
var description: String {
return prepareStringConvertable()
}
var debugDescription: String {
return prepareStringConvertable()
}
// MARK: - Methods
func prepareStringConvertable() -> String {
var desc = "\(value)"
if !children.isEmpty {
desc += " {" + children.map { $0.description }.joined(separator: ", ") + "}"
}
return desc
}
}
//: Usage
let nodeApple = Node<String>(value: "Apple")
let nodeFoo = Node<String>(value: "Foo")
let nodeBar = Node<String>(value: "Bar")
let nodeChair = Node<String>(value: "Chair")
nodeApple.insert(child: nodeFoo)
nodeApple.insert(child: nodeBar)
nodeBar.insert(child: nodeChair)
print(nodeApple)
let foundNode = nodeApple.search(value: "Bar")
print(foundNode)
//: [Next](@next)