본문 바로가기

스피드 문법정리

10. Closures

Closures

Closures는 글로벌 스코프에서 단독으로 작성할 수 없음

{ (parameters) -> ReturnType in
    statements
}
{ statements }

Closures에서는 argument label을 사용하지 않음 -> 아래 예시에서 str은 parameter 이름일 뿐 argument label이 아님, Closures호출시 argument label 사용하지 않음

argument위치에 직접 작성한 클로져를 인라인 클로져라고 함 -> 클로져 바디에 구현한 코드가 비교적 짧은 경우 인라인 클로져로 작성

let c = { print("Hello, Swift") }
c() // "Hello, Swift"

let c2 = { (str : String) -> String in
    return "Hello, \(str)"
}

let result = c2("Closure") // "Hello, Closure"
print(result)  // "Hello, Closure"

typealias SimpleStringClosure = (String) -> String

func perform(closure : SimpleStringClosure) {
    print(closure("ios"))
}

perform(closure : c2) // "Hello, ios"
perform(closure : (str : String) -> String in
    retrun "Hi, \(str)"
}) // "Hello, ios"
let products = [
"MacBook Air", "MacBook Pro", "iMac", "iMac Pro", "Mac Pro", "Mac mini", "ipad Pro",
"iPad", "iPad mini", "iPhone Xs", "iPhone Xr", "iPhone 8", "iPhone 7", "AirPods",
"Apple Watch Series 4", "Apple Watch Nike+"
]

var proModels = products.filter({ (name : String) -> Bool in
    return name.contains("Pro")
})
print(proModels) // ["MacBook Pro", "iMack Pro", "Mack Pro", "iPad Pro"]

Closures Syntax Optimiztion

컴파일러가 추론 가능한 부분은 대부분 생략, 

let products = [
"MacBook Air", "MacBook Pro", "iMac", "iMac Pro", "Mac Pro", "Mac mini", "ipad Pro",
"iPad", "iPad mini", "iPhone Xs", "iPhone Xr", "iPhone 8", "iPhone 7", "AirPods",
"Apple Watch Series 4", "Apple Watch Nike+"
]

var proModels = products.filter({ (name : String) -> Bool in
    return name.contains("Pro")
})

// 1. filter 메소드는 프레임워크에 구현되어있기 때문에 컴파일러는 프레임워크를 통해 추론이 가능
// 파라미터 형식과 리턴형 생략 가능

proModels = products.filter({ (name) in
    return name.contains("Pro")
})

// 2. 파라미터의 이름은 Shorthand Argument Names로 대체, 파라미터의 이름과 in 키워드는 생략
proModels = products.filter({
    return $0.contains("Pro")
})

// 3. 클로저 표현식에 단일 return 문만 남아있는경우 return 키워드 생략 (Implicit Returns)
proModels = products.filter({
    $0.contains("Pro")
})

// 4. 클로져 파라미터가 마지막 파라미터라면 Trailing Closures로 작성
// Trailing Closures는 함수나 메소드 호출식 뒤에 따라오는 클로져
proModels = products.filter() {
    $0.contains("Pro")
}

5. 괄호 사이에 다른 파라미터가 없다면 괄호 생략
proModels = products.filter {
    $0.contains("Pro")
}

'스피드 문법정리' 카테고리의 다른 글

11. String and Character  (0) 2020.06.24
20. Protocol  (0) 2020.06.23
18. Initializer and Deinitializer  (0) 2020.06.22
17. Inheritance and Polymorphism  (0) 2020.06.19
16. Method and Subscript  (0) 2020.06.19