Closure, Higher-order function in Swift

Preview:

Citation preview

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

Recommended