CLOSURE &
HIGHER-ORDER FUNCTION
let us: Go!2017 Spring
• Closure
• Higher-Order Functions in Swift
CLOSURE
CLOSURE
•
•
• , , ,
• :
CLOSURE
• ,
• return
•
•
CLOSURE
CLOSURE AS PARAMETER
func sorted(by areInIncreasingOrder: (E, E) -> Bool) -> [E]
(Type, Type) -> Type
CLOSURE
func backwards(left: String, right: String) -> Bool {
print("\(left) \(right) ") return left > right }
let names: [String] = ["hana", "eric", "yagom", "kim"]
let reversed: [String] = names.sorted(by: backwards)
print(reversed)
CLOSURE
let reversed: [String]
reversed = names.sorted (by: { (left: String, right: String) -> Bool in return left > right })
print(reversed) // ["yagom", "kim", "hana", "eric"]
CLOSURE
// let reversed: [String] = names.sorted() { (left: String, right: String) -> Bool in return left > right }
// sorted(by:) . let reversed: [String] = names.sorted { (left: String, right: String) -> Bool in return left > right }
CLOSURE
// . let reversed: [String] = names.sorted { (left, right) in return left > right }
CLOSURE
// let reversed: [String] = names.sorted { return $0 > $1 }
// let reversed: [String] = names.sorted { $0 > $1 }
HIGHER-ORDER FUNCTIONS
•
• map, filter, reduce
MAP
• (transform)
TRANSFORM USING FOR STATEMENT
let numbers: [Int] = [0, 1, 2, 3, 4] var doubledNumbers: [Int] = [Int]() var strings: [String] = [String]()
// for for number in numbers { doubledNumbers.append(number * 2) strings.append("\(number)") }
print(doubledNumbers) // [0, 2, 4, 6, 8] print(strings) // ["0", "1", "2", "3", "4"]
MAP EXAMPLE
// map doubledNumbers = numbers.map({ (number: Int) -> Int in return number * 2 }) strings = numbers.map({ (number: Int) -> String in return "\(number)" })
print(doubledNumbers) // [0, 2, 4, 6, 8] print(strings) // ["0", "1", "2", "3", "4"]
MAP EXAMPLE
// , , (return) // doubledNumbers = numbers.map { $0 * 2 }
print(doubledNumbers) // [0, 2, 4, 6, 8]
FILTER
•
FILTER USING FOR STATEMENT
let numbers: [Int] = [0, 1, 2, 3, 4, 5] var evenNumbers: [Int] = [Int]()
// for for number in numbers { if number % 2 != 0 { continue } evenNumbers.append(number) }
print(evenNumbers) // [0, 2, 4]
FILTER EXAMPLE
let numbers: [Int] = [0, 1, 2, 3, 4, 5]
let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in return number % 2 == 0 } print(evenNumbers) // [0, 2, 4]
FILTER EXAMPLE
let oddNumbers: [Int] = numbers.filter { $0 % 2 != 0 } print(oddNumbers) // [1, 3, 5]
REDUCE
•
REDUCE USINGFOR STATEMENT
let numbers: [Int] = [2, 8, 15] var sum: Int = 0
for number in numbers { sum += number }
print(sum) // 25
REDUCE EXAMPLE
let numbers: [Int] = [2, 8, 15]
// 0 . let sum: Int = numbers.reduce(0, { (first: Int, second: Int) -> Int in print("\(first) + \(second)") return first + second })
print(sum) // 25
!
REDUCE EXAMPLE
let numbers: [Int] = [2, 8, 15]
// 0 . let subtract: Int = numbers.reduce(0, { (first: Int, second: Int) -> Int in print("\(first) - \(second)") return first - second })
print(subtract) // -25
REDUCE EXAMPLE// 3 . let sumFromThree = numbers.reduce(3) { $0 + $1 }
print(sumFromThree) // 28/* var sum: Int = 3
for number in numbers { sum += number } */
Q&A