Skip to content

Commit bad2ed5

Browse files
committed
sequence
0 parents  commit bad2ed5

File tree

4 files changed

+129
-0
lines changed

4 files changed

+129
-0
lines changed

Sequence.playground/Contents.swift

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
//: Playground - noun: a place where people can play
2+
3+
import UIKit
4+
5+
struct Beer: CustomDebugStringConvertible {
6+
var brandName: String
7+
var volume: Int
8+
9+
var debugDescription: String {
10+
return "\(brandName): \(volume) ml"
11+
}
12+
13+
public var isCan: Bool {
14+
return (self.volume < 350)
15+
}
16+
}
17+
18+
19+
struct BeerContainer {
20+
let elements: [Beer]
21+
var i = 0
22+
23+
init(elements: [Beer]) {
24+
self.elements = elements
25+
}
26+
}
27+
28+
extension BeerContainer: IteratorProtocol {
29+
typealias Element = Beer
30+
31+
mutating func next() -> Element? {
32+
defer {
33+
i+=1
34+
}
35+
return i<elements.count ? elements[i] : nil
36+
}
37+
}
38+
39+
// Origin
40+
//struct VendorMachine {
41+
// let elements: [Beer]
42+
//}
43+
44+
// Using IndexingIterator
45+
//extension VendorMachine: Sequence {
46+
// typealias Iterator = IndexingIterator<[Beer]>
47+
//
48+
// func makeIterator() -> Iterator {
49+
// return elements.makeIterator()
50+
// }
51+
//
52+
//}
53+
54+
// Try AnyIterator
55+
//extension VendorMachine: Sequence {
56+
// typealias Iterator = AnyIterator<Beer>
57+
//
58+
// func makeIterator() -> Iterator {
59+
// var iterator = elements.makeIterator()
60+
// return AnyIterator {
61+
// iterator.next()
62+
// }
63+
// }
64+
//}
65+
66+
// Use our Iterator
67+
//extension VendorMachine: Sequence {
68+
// typealias Iterator = BeerContainer
69+
//
70+
// func makeIterator() -> Iterator {
71+
// return BeerContainer(elements: self.elements)
72+
// }
73+
//}
74+
75+
struct VendorMachine: Sequence {
76+
typealias Iterator = AnyIterator<Beer>
77+
78+
let elements: [Beer]
79+
80+
func makeIterator() -> Iterator {
81+
var i = self.elements.startIndex
82+
return AnyIterator {
83+
defer {
84+
i+=1
85+
}
86+
return i<self.elements.count ? self.elements[i] : nil
87+
}
88+
}
89+
}
90+
91+
92+
let aOrionBeer = Beer(brandName: "Orion", volume: 300)
93+
let aSaporoBeer = Beer(brandName: "Saporo", volume: 380)
94+
let aTaiwanBeer = Beer(brandName: "TaiwanBeer", volume: 330)
95+
let aAsahiBeer = Beer(brandName: "Asahi", volume: 420)
96+
97+
98+
var aBeerContainer = BeerContainer(elements: [ aOrionBeer, aSaporoBeer, aTaiwanBeer, aAsahiBeer ])
99+
100+
while let aBeer = aBeerContainer.next() {
101+
print(aBeer)
102+
}
103+
104+
105+
let aMachine = VendorMachine(elements: [ aOrionBeer, aSaporoBeer, aTaiwanBeer, aAsahiBeer ])
106+
for beer in aMachine {
107+
print(beer)
108+
}
109+
110+
let sortedBeers = aMachine.sorted { $0.volume>$1.volume }
111+
print(sortedBeers)
112+
113+
let largeBeers = aMachine.filter { $0.volume>400 }
114+
print( largeBeers )
115+
116+
let totalVolume = aMachine.reduce(0) { return $0+$1.volume }
117+
print(totalVolume)
118+
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<playground version='5.0' target-platform='ios'>
3+
<timeline fileName='timeline.xctimeline'/>
4+
</playground>

Sequence.playground/playground.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)