티스토리 뷰

반응형

 

안녕하세요 :) Zedd입니다.

Swift 5.7에서 추가된 기능인 Multi-statement closure type inference를 살펴볼게요!

 

# Swift 5.7 이전

간단한 closure를 살펴봅시다. 

let results = ["Zedd", "", "Walker", ""].map { _ in
    return true
}

이럴 때는 closure내부에 리턴타입을 명시하지 않아도 됩니다.

이정도는 Swift가 추론할 수 있기 때문...이겠죠?

다만, 

let results = ["Zedd", "", "Walker", ""].map { value in
    if value.isEmpty { return false }
    return true
}

이런 if나 do-catch같은 statement가 closure내부에 추가되면 

Swift : 요 아이 Return타입 써주시겠어요? 🙏 

Zedd : ㅋㅋ... **

let results = ["Zedd", "", "Walker", ""].map { value -> ✅Bool✅ in
    if value.isEmpty { return false }
    return true
}

끝내 Return 타입을 붙히고 마는데..

 

또 하나 익숙한 예를 들어봅시다. 

let myView: UIView = {
    let view = UIView()
    // configure...
    return view
}()

let button: UIButton = {
    let button = UIButton()
    // configure...
    return button
}()

custom decoder를 선언하고 싶을때도

let decoder: JSONDecoder = {
    let decoder = JSONDecoder()
    // configure...
    return decoder
}()

이런식으로 하곤 하죠.

아래와 같이 

let myView = {
    let view = UIView()
    // configure...
    return view
}()

여기서도 타입을 명시적으로 주지 않으면, 또 칼같이;;;

위에서 본 똑같은!!!! 에러가 뜹니다. 


에러는 대충 

multi statements가 있는 closure의 리턴 타입을 추론할 수 없다. 명확하게 하기 위해서 명시적으로 타입을 지정해라.


인데요. 

Swift 5.7에서는 closures본문에서 타입 추론을 활성화 하여, multi-statement closures의 추론 동작이 개선되었습니다.

 

# Multi-statement closure type inference

Swift 5.7에서는 리턴타입을 명시하지 않은 아래 코드 모두 컴파일 가능합니다. 

let results = ["Zedd", "", "Walker", ""].map { value in
    if value.isEmpty { return false }
    return true
}
let myView = {
    let view = UIView()
    return view
}()

let button = {
    let button = UIButton()
    // configure...
    return button
}()
let decoder = {
    let decoder = JSONDecoder()
    // configure...
    return decoder
}()

으음 맛있다

 

참고

[SE-0326] Enable multi-statement closure parameter/result type inference

반응형

'Swift' 카테고리의 다른 글

[Swift] Opaque Type  (4) 2022.12.23
[Swift 5.7] Type inference from default expressions  (0) 2022.08.05
[Swift 5.7] if let shorthand  (1) 2022.07.09
Swift 5.6 ) Introduces existential any  (9) 2022.04.03
Swift ) Sequence  (1) 2022.02.05