Swift
[Swift 5.7] Multi-statement closure type inference
Zedd0202
2022. 7. 9. 17:48
반응형
안녕하세요 :) 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
반응형