요번에는 클로저의 심화 지식들에 대해 알아보자.
클로저
import Foundation
func functionA() -> () -> Int{
var counter = 0
func functionB() -> Int{
return counter + 10
}
return functionB
}
let myClosure = functionA()
let result = myClosure()
클로저 표현식
정렬 메서드
import Foundation
let names : [String] = ["Lion", "Tiger", "Elephant]
func backward(_ s1: String, _ s2: String) -> Bool{
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
//var reversedNames = names.sorted(by: >) <- 이런것도 된다.
print(reversedNames)
클로저 표현구
//전역함수 backward와 똑같이 작동하는 클로저 표현식을 만들어
//sorted의 by: 매개변수로 인라인 클로저라는 구현법으로 바로 써서 보낸다.
reversedNames = names.sorted(by: {(s1: String, s2: String) -> Bool in
return s1 > s2
})
print(reversedNames)
//더 짧은 표현
//배열이 String 문자열들로 채워진 걸 아니까
reversedNames = names.sorted(by: {(_ s1, _ s2) -> Bool in return s1 > s2})
print(reversedNames)
//더 짧게
reversedNames = names.sorted(by: { s1, s2 in s1 > s2})
print(reversedNames)
//이렇게도 된다.
reversedNames = names.sorted(by: {$0 > $1})
print(reversedNames)
let strings: [String] = numbers.map{(number) -> String in
//매개변수로 가져온 number는 상수이기 때문에, 변수로 다시 만들어줘야 변경 가능.
var n = number
var output = ""
repeat {
if let name = digitNames[number % 10]{
output = name + output
}else{
output = "?" + output
}
}while n > 0
return output
}
print(strings)
repeat {
if let name = digitNames[number % 10] ?? "?"
output = name + output
n /= 10
}while n > 0
캡처값
func makeIncrementer(forIncrement amount: Int) -> () -> Int{
var runningTotal: Int = 0
func incrementer()-> Int{
runningTotal += amount
return runningTotal
}
return incrementer
}
let increFunc = makeIncrementer(forIncrement: 10)
print("\(increFunc())")//10
print("\(increFunc())")//20
클로저는 참조 타입이다.
이스케이프 클로저
var completionHandlers: [() -> Void] = []
func someFunctionWithExcapingClosure(completionHandler: @excaping () -> Void){
completionHandlers.append(completionHandler)
}
뮤테이팅
import Foundation
class SomeClass{
var name: String = ""
func changeName(newName : String){
self.name = newName
}
}
var somethingByClass = SomeClass()
somethingByClass.changeName(newName: "ned")
print("\(somethingByClass.name)")
struct SomeClass{
var name: String = “"
mutating func changeName(newName : String){
self.name = newName
}
}
var somethingByStruct = SomeStruct()
somethingByStruct.changeName(newName: "뽀로로")
print("\(somethingByStruct.name)")