|
1 |
| -/*: |
2 |
| - |
3 |
| - ## Learn Swift with Bob |
4 |
| - ### Functional Programming |
5 |
| - ### Map |
6 |
| - |
7 |
| - **Problem:** A closure is too long to pass through a function |
8 |
| - |
9 |
| - --- |
10 |
| - */ |
11 |
| - |
12 |
| - |
13 |
| - |
14 |
| -var values = [2.0,4.0,5.0,7.0] |
15 |
| -var squares: [Double] = [] |
16 |
| -for value in values { |
17 |
| - squares.append(value*value) |
18 |
| -} |
19 |
| - |
20 |
| - |
21 |
| -values = [2.0,4.0,5.0,7.0] |
22 |
| -squares = values.map { $0 * $0 } |
23 |
| -// [4.0, 16.0, 25.0, 49.0] |
24 |
| - |
25 | 1 |
|
| 2 | +//: Imperative/Non-functional |
| 3 | +var squaredNumbers: [Double] = [] |
26 | 4 |
|
| 5 | +var numbers = [1.0, 2.0, 3.0, 4.0, 5.0] |
| 6 | +for number in numbers { |
| 7 | + squaredNumbers.append(number * number) |
| 8 | +} |
27 | 9 |
|
| 10 | +numbers.map { $0 * $0 } // [1, 4, 9, 16, 25] |
| 11 | +let cast = ["Vivien", "Marlon", "Kim", "Karl"] |
| 12 | +let lowercaseNames = cast.map { $0.lowercased() } |
28 | 13 |
|
| 14 | +func myMap(numbers: [Double], logic: (Double) -> Double) -> [Double] { |
| 15 | + var result: [Double] = [] |
| 16 | + for number in numbers { |
| 17 | + let transformedValue = logic(number) |
| 18 | + result.append(transformedValue) |
| 19 | + } |
| 20 | + return result |
| 21 | +} |
29 | 22 |
|
30 |
| -func myMap<T, U>(_ items: [T], _ f: (T) -> U) -> [U] { |
| 23 | +myMap(numbers: [1, 2, 3, 4, 5]) { (number) -> Double in number * 10 } |
| 24 | +myMap(numbers: [1, 2, 3, 4, 5]) { $0 * 10 } |
| 25 | +//: Generics |
| 26 | +func myMap<T, U>(_ items: [T], _ operation: (T) -> U) -> [U] { |
31 | 27 | var result = [U]()
|
32 | 28 | for item in items {
|
33 |
| - result.append(f(item)) |
| 29 | + result.append(operation(item)) |
34 | 30 | }
|
35 | 31 | return result
|
36 | 32 | }
|
37 | 33 |
|
| 34 | +myMap([1, 2, 3, 4 , 5, 6]) { String($0 * $0) } |
| 35 | +//: The Purest Form |
| 36 | +extension Array { |
| 37 | + func myMap<U>(_ operation: (Element) -> U) -> [U] { |
| 38 | + var result = [U]() |
| 39 | + for item in self { |
| 40 | + result.append(operation(item)) |
| 41 | + } |
| 42 | + return result |
| 43 | + } |
| 44 | +} |
| 45 | + |
| 46 | + |
| 47 | +let result = Array(1...10).myMap { $0 * 10 } |
| 48 | +print(result) |
38 | 49 |
|
39 |
| -print(myMap([1, 2, 3, 4 , 5, 6]) { $0 * $0 }) |
40 | 50 |
|
41 | 51 |
|
0 commit comments