새로워진 Swift 6 (WWDC24: What's new in Swift)
10년 간의 Swift 변천사
- 2014년: Swift의 시작
- 2015년: 오픈 소스로 전환, Linux에서도 사용 가능
- 2016년: Swift 3, SPMSwift Package Manager 도입
- 2017년: Swift 4, 최신 버전으로 마이그레이션하지 않아도 되는 기능이 추가
- 2018년:
Generics
의 개선과 조건부 적합성Conditional Conformances 도입 1
// 조건부 적합성
extension Array: Comparable where Element: Comparable {
static func < (lhs: Array<Element>, rhs: Array<Element>) -> Bool {
// 비교 로직
}
}
- 2019년: SwiftUI, ABIApplication Binary Interface 도입 2
- 2020년: Windows 포트가 swift.org 제공
- 2021년: Swift Concurrency 도입
비동기/대기(Async/Await), 액터(Actors), 구조적 동시성(structured concurrency) 등 - 2022년: Distributed actors 도입 3
- 2023년: C++와 상호 운용이 강화, Macros 도입
Swift.org
Swift Package Index를 통해서 package 선택에 편리
또는 Swift 커뮤니티에서 논의되는 흥미로운 패키지를 추천하는 Community Showcase
Swift project를 위한 새로운 GitHub
everywhere
Foundation
- 일관성 및 성능 향상: Foundation의 구현이 일관성이 더 높아지고, 품질이 향상되었으며, 성능도 개선
이는 JSON 디코딩, 날짜 및 시간 포맷팅, 파일 처리 등과 같은 다양한 API에서 바로 경험 가능 - 모든 플랫폼에 동시 출시: 새로운 기능과 개선 사항이 모든 지원되는 플랫폼에 동시에 제공
이는 개발자들이 어떤 플랫폼을 사용하든 최신의 Foundation 기능을 사용 가능 - 오픈 소스화: Swift Foundation은 오픈 소스로 제공
새로운 API를 추가하기 위한 오픈 에볼루션 프로세스도 운영 - Objective-C와의 상호운용성: 심지어 Objective-C로 작성된 애플리케이션도 이러한 개선 사항의 혜택
스위프트와의 호환성을 극대화하여 더 나은 성능과 기능을 제공
Swift Testing
Macros와 같은 최신 Swift 기능을 활용하여 동시성과 원활하게 통합
크로스 플랫폼을 염두에 두고 오픈 소스로 개발
import Testing
// 테스트를 선언하기 위해 Test 특성 추가
// 지정된 표시 이름을 제공
// tags를 사용하여 필터링
// 여러 입력의 중복되는 것을 방지하기 위해 인수를 사용 가능
@Test("Recognized rating",
.tags(.critical),
arguments: [
(1, "A Beach", "⭐️⭐️⭐️⭐️⭐️"),
(2, "Mystery Creek", "⭐️⭐️⭐️⭐️"),
])
func rating(videoId: Int, videoName: String, expectedRating: String) {
let video = Video(id: videoId, name: videoName)
// 매크로인 #expect를 사용하여 결과가 충족되는지 확인
@expect(video.rating == expectedRating)
}
자세한 내용은 WWDC24: Meet Swfit Testing
Builds
- 모듈 병렬 빌드: 스위프트 6부터는 모듈 빌드가 병렬로 수행 가능
이는 빌드 로그에 명확히 나타나며, 더 예측 가능하고 신뢰할 수 있는 빌드를 제공 - 디버깅 속도 향상: 디버거가 빌드와 바이너리 모듈을 공유할 수 있어, 디버깅 속도가 단축
- 명시적 모듈 빌드: 명시적 모듈 빌드는 Xcode 빌드 설정에서 활성화
이는 빌드 프로세스의 명확성을 높이고, 모듈 의존성을 더 잘 관리 가능 - 크로스 컴파일: macOS에서 리눅스 서버로 크로스 컴파일할 수 있는 기능도 강조
예를 들어, macOS에서 리눅스용으로 스위프트 패키지를 빌드하고, 해당 바이너리를 리눅스 서버에 배포 가능 - 정적 링크 SDK 사용: 스위프트에서 정적 링크 Linux SDK를 사용하여, 추가 패키지를 설치하지 않고도 모든 리눅스 머신에서 실행할 수 있는 정적 링크 바이너리를 생성 가능
Language update
Noncopyable type
기본 복사 가능성을 억제합니다.
고유한 소유권을 표현하려는 시나리오에 적합합니다.
예를 들어, 파일과 같은 고유한 시스템 리소스는 deinit
을 사용하여 ~Copyable
로 표시가 가능합니다.
동일한 파일에 대한 런타임 문제 혹은 리소스 누수를 방지합니다.
파일을 open할 때 파일 이름이 유효할 때에만 생성할 수 있는 실패 가능한 init
으로 deinit
해제되지 않는 상황에 대한 문제를 해결할 수 있습니다.
이전까지는 구체적인 유형으로만 제한이 되었지만,
Swift 6에서는 Noncopyable type을 지원합니다.
- all generic contexts
- Optional, Result, Unsafe Pointers와 같은 표준 라이브러리
자세한 내용은 WWDC24: Consume noncopyable types in Swift
Embedded Swift
Embedded Swift
는 자원이 제한된 시스템에서 스위프트를 실행할 수 있도록 최적화된 새로운 언어 하위 집합입니다.Noncopyable type
을 지원하여 메모리 및 성능 효율성을 극대화할 수 있습니다.
Apple 장치에서 데이터를 보호하기 위해 사용되는 Secure Enclave Process에서도 Embedded Swift를 사용합니다.
C와 C++와의 상호 운용성을 갖추고 있어 점진적으로 Swift를 채택할 수 있습니다.
C++
안전 보장이 부족하여 보안 공격에 노출되어 있던 C++ 프로젝트
Swift를 점진적으로 도입하여 보안과 생산성을 향상시킬 수 있습니다.
// C++
struct Person {
Person(const Person&) = delete;
Person(Person &&) = default;
};
// Swift
struct Developer: ~Copyable {
let person: Person
init(person: consuming Person) {
self.person = person
}
}
let person = Person()
let developer = Developer(person: person)
person.printInfo() // 의도치 않게 "~Copyable" 값을 복사하려고 하면 컴파일러가 진단
throws
유형 삭제가 되기에 Error
의 구체적인 정보를 잃기 때문에 동적 유형 검사를 삽입해야 했었습니다.
do {
let value = try parse(string: "1+234")
} catch let error as IntegerParseError {
// ...
}
유형 삭제에는 boxing 및 unboxing도 포합됩니다.
런타임 할당 기능이 없는 고도로 제한된 시스템에서는 문제가 됩니다.
Swift 6에서는 Typed Throw를 도입
입력된 throws 키워드와 함께 오류 유형을 지정할 수 있습니다.
func parse(string: String) throws(IntegerParseError) -> Int {
for index in string.indices {
// ...
throw IntegerParseError.nonDigitCharacter(string, index: index)
}
}
자세한 내용은 swift-evolution: 0413-typed-throw
data-race safety
점진적으로 데이터 경합 안정성을 달성했습니다.
Swift 6에서는 Data-Race Safety
가 기본적으로 적용됩니다.
병렬적으로 실행될 수 있는 유사 스레드 Actor는 내부 상태를 보호하고 메시지 교환을 통해 안전하게 동작할 수 있도록 합니다.Complete Concurrency Checking
기능으로 런타임 중 데이터 경쟁이 발생할 가능성이 있는 부분을 미리 감지하고 에러를 방지합니다.