안녕하세요. 개발하는 정주입니다.
오늘은 "Swift 5.7 변경점"에 대해 알아보겠습니다.
간단히 소개하는 정도의 포스팅이 되겠습니다.
Swift 문서 업데이트
WWDC22에서 Swift 5.7이 소개되었습니다.
Xcode 14.0 베타 버전을 설치하면 Swift 5.7을 사용할 수 있습니다.
Swift Document는 2022년 6월 6일에 5.7 버전 내용이 업데이트되었습니다.
if let 간략화
optional 변수를 언래핑하는 문법이 간략화되었습니다.
기존에는 아래와 같이 옵셔널 변수를 같은 이름으로 shadowing 하여 옵셔널 바인딩을 해주었습니다.
let myNumber = Int(possibleNumber)
// Here, myNumber is an optional integer
if let myNumber = myNumber {
// Here, myNumber is a non-optional integer
print("My number is \(myNumber)")
}
// Prints "My number is 123"
variable shadowing은 변수명이 길 경우 가독성 저하를 불러왔습니다.
if let longlonglonglongVariable = longlonglonglongVariable {
...
}
Swift 5.7부터는 이런 불필요한 variable shadowing을 하지 않아도 됩니다.
if let myNumber {
print("My number is \(myNumber)")
}
// Prints "My number is 123"
위 코드처럼 바로 let이나 var로 언래핑이 가능합니다.
단, 이 개선 사항은 객체 내부의 property에는 적용되지 않습니다.
struct Phone {
var number: String
}
let phone: Phone? = Phone(number: "010-0000-0000")
if let phone.number {
print("Call \(phone.number)!")
}
따라서 위와 같은 문법은 불가능해요!
Multiple statement closure 타입 추론
클로저에 대한 타입 추론이 향상되었다고 합니다.
기존에는 아래와 같이 직접 클로저의 반환 타입 또는 변수의 타입을 명시해주어야 했습니다.
//let oldResults: [String] = scores.map { score in
let oldResults = scores.map { score -> String in
if score >= 85 {
return "\(score)%: Pass"
} else {
return "\(score)%: Fail"
}
}
만약 이를 명시하지 않으면 타입 추론에 대한 컴파일 에러가 발생했죠
Swift 5.7에서는 자동으로 타입 추론을 해줍니다.
let results = scores.map { score in
if score >= 85 {
return "\(score)%: Pass"
} else {
return "\(score)%: Fail"
}
}
그렇기 때문에 results: [String] 또는 score -> String으로 타입을 명시하지 않아도 됩니다.
코드가 짧아지는 대신 가독성의 저하가 발생할 수 있으니 잘 선택해서 사용해야겠습니다.
type checking 빌드 속도 개선
WWDC22의 What's new in Swift 영상에서 type checking의 성능 개선에 대한 내용도 짧게 소개합니다.
Swift 5.6에서 빌드 속도는 17초가 소요되었고 Swift 5.7에서는 760ms가 걸렸습니다.
17초가 17000ms라는 것을 안다면 얼마나 빨라진 건지 아실 겁니다 ㄷㄷ
저는 아직 작은 프로젝트만 진행해봤기 때문에 빌드 속도에 큰 차이가 없지만
큰 프로젝트에서 이러한 개선사항은 두 손 벌려 환영할 부분인 것 같네요.
Clock, Instant, Duration
Swift 5.7에서는 시간과 기간을 참조하는 새롭고 표준화된 방법을 도입했다고 합니다.
- Clocks represent a way of measuring time passing. There are two built in: the continuous clock keeps incrementing time even when the system is asleep, and the suspending clock does not.
- Instants represent an exact moment in time.
- Durations represent how much time elapsed between two instants.
Task API에서 기존에 사용하던 nanoseconds 대신 seconds를 이용해 더 합리적으로 작업할 수 있도록 했습니다.
try await Task.sleep(until: .now + .seconds(1), clock: .continuous)
이것의 장점은 허용 오차를 지원한다는 것인데요.
최소 1초 동안은 sleep 하고 싶지만 0.5초 정도는 더 sleep 할 수 있다는 것을 아래와 같이 표현 가능하다고 합니다.
try await Task.sleep(until: .now + .seconds(1), tolerance: .seconds(0.5), clock: .continuous)
이러한 변화로 인해 기존 나노초 기반의 API는 사라질 것으로 예상된다고 합니다!
Swift 정규식
Swift에서 정규식을 표현할 수 있게 되었습니다.
정규식은 아래 사진처럼 해석하기도, 작성하기도 매우 복잡한 형식을 가집니다.
Swift 5.7에서는 정규식을 표현하는 새로운 문자열 처리 기능이 추가되었습니다. (지원은 Swift 6부터 한다고 하네요.)
let search1 = /My name is (.+?) and I'm (\d+) years old./
let greeting1 = "My name is Taylor and I'm 26 years old."
if let result = try search1.wholeMatch(in: greeting1) {
print("Name: \(result.1)")
print("Age: \(result.2)")
}
search1은 greeting1에서 Taylor와 26을 추출하기 위한 정규식입니다.
위처럼 해석하기도, 작성하기도 어려운 정규식이 아래처럼 바뀔 수 있습니다.
let search3 = Regex {
"My name is "
Capture {
OneOrMore(.word)
}
" and I'm "
Capture {
OneOrMore(.digit)
}
" years old."
}
훨씬 더 직관적이고 작성하기도 편해졌습니다.
TryCapture를 이용하면 캡처를 실패하거나 오류가 발생했을 때에 대한 예외 처리도 가능합니다.
let search4 = Regex {
"My name is "
Capture {
OneOrMore(.word)
}
" and I'm "
TryCapture {
OneOrMore(.digit)
} transform: { match in
Int(match)
}
Capture(.digit)
" years old."
}
마무리
WWDC22에서 소개한 Swift 5.7의 변경점이었습니다.
아직 Swift에 대해 모르는 것이 많아 소화하지 못한 게 많습니다.
그래서 단순히 소개만 하는 단계로 포스팅을 하게 되어 안타까운 마음입니다.
경험이 쌓여 WWDC의 영상만 보고도 어느 정도 이해가 되는 단계가 왔으면 좋겠습니다.
열심히 해야겠네요 ㅎㅎ
감사합니다!
출처
https://www.hackingwithswift.com/articles/249/whats-new-in-swift-5-7
https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID333
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.