chapter 9 - swift.pptx

14
Chapter 9 Closures

Upload: hien-nguyen

Post on 14-Nov-2015

213 views

Category:

Documents


1 download

TRANSCRIPT

Chapter 9

Chapter 9ClosuresWhat higher order functions areHow to accept functions as parameters and return functionsHow to nest functionsWhat a closure isHow to use reduce code with closuresThe Type of a Function(type of parameters) -> (type of return value)Example:func sum(a: Int, b: Int) -> Int {return a + b}The type of this function is (Int, Int) -> Intvar s : (Int, Int) -> Int = sumprintln(s(2,3))Function that returns a function35: func performMathAverage(mathFunc: String) -> ([Int]) -> Double {36: switch mathFunc {37: case "mean":38: return mean39: case "median":40: return median41: default:42: return mode43: }44: }45: 46: var mathFunc = performMathAverage("mean")47: mathFunc([1, 1, 2, 3, 5, 8, 13]) // 4.714285714285...48: mathFunc = performMathAverage("median")49: mathFunc([4, 5, 6]) // 5.050: mathFunc = performMathAverage("mode or not mode")51: mathFunc([1, 1, 2, 3, 5, 8, 13]) // 1.0Nesting Functions Within Functions01: func performMathAverage(mathFunc: String) -> ([Int]) -> Double {02: var sum = 0.003: func mean(numbers: [Int]) -> Double {04: for number in numbers {05: sum += Double(number)06: }07: return sum / Double(numbers.count)08: }09: func median(numbers: [Int]) -> Double {11: // insert median code here12: }13: func mode(numbers: [Int]) -> Double {// insert mode code here16: }17: switch mathFunc {19: case "mean": return mean21: case "median": return median23: default: return mode25: }26: }27: var mathFunc = performMathAverage("mean")28: mathFunc([10, 11, 10, 12, 10, 13]) // displays 11.029: mathFunc = performMathAverage("median")30: mathFunc([10, 11, 10, 12, 10, 13]) // displays 11.031: mathFunc = performMathAverage("mode")32: mathFunc([10, 11, 10, 12, 10, 13]) // displays 10.0Using a function as parameters to a function.func square(num: Int) -> Int {return num * num}func mapEachElement(inArray arr: [Int], withFunc aFunc: (Int) -> Int) -> [Int] {var returnArray = [Int]()for num in arr {returnArray.append(aFunc(num))}return returnArray}let firstArray = [1, 2, 3, 4, 5]let squareArray = mapEachElement(inArray: firstArray, withFunc: square)println(squareArray)ClosuresThree types of closures:global functionsnested functionsclosure expressions

Using reduce Function on an Arrayfunc mean2(numbers: [Int]) -> Double {02: var sum = 003: func meanCombine(num1: Int, num2: Int) -> Int {04: return num1 + num205: }06: sum = numbers.reduce(0, meanCombine)07: return Double(sum) / Double(numbers.count)08: }09: mean2([5, 6, 7]) // displays 6.0

Using Closure Expressions as Parameters01: func mean3(numbers: [Int]) -> Double {02: let sum = numbers.reduce(0, { (num1: Int, num2: Int) -> Int in03: return num1 + num204: })05: return Double(sum) / Double(numbers.count)06: }07: mean3([2, 3, 4, 5, 6, 7]) // displays 4.5Removing the types01: func mean4(numbers: [Int]) -> Double {02: let sum = numbers.reduce(0, { num1, num2 in03: return num1 + num204: })05: return Double(sum) / Double(numbers.count)06: }07: mean4([1, 1, 2, 3]) // displays 1.75Implicit Return Statements in a Closure Expression01: func mean5(numbers: [Int]) -> Double {02: let sum = numbers.reduce(0, { num1, num2 in num1 + num2 })03: return Double(sum) / Double(numbers.count)04: }05: mean5([7, 7, 11]) // displays 8.3333Shorthand argument names01: func mean6(numbers: [Int]) -> Double {02: let sum = numbers.reduce(0, {$0 + $1})03: return Double(sum) / Double(numbers.count)04: }05: mean6([10, 11, 12]) // displays 11.0Trailing closure01: func mean7(numbers: [Int]) -> Double {02: let sum = numbers.reduce(0) {$0 + $1}03: return Double(sum) / Double(numbers.count)04: }05:06: func mean8(numbers: [Int]) -> Double {07: return Double(numbers.reduce(0) {$0 + $1}) / Double(numbers.count)08: }Operator functionslet a = [5, 4, 1, 3, 2]let b = a.sorted({ (num1: Int, num2: Int) -> Bool in return num1 < num2})let b = a.sorted({ num1, num2 in return num1 < num2})let b = a.sorted({ num1, num2 in num1 < num2 })let b = a.sorted({ $0 < $1 })let b = a.sorted { $0 < $1 }let b = a.sorted(