Swift 5.5에서 추가된 내용은 아래와 같다고합니다.
>1. Diversity
>2. Update on Swift Packages
>3. Update on Swift on server
>4. Developer experience improvements
>5. Ergonomic improvements
>6. Asynchronous and concurrent programming
## Diversity
- Swift 개발자 커뮤니티와 Swift 멘토링 프로그램
- [swift.org/diversity](https://www.swift.org/diversity/)
## Update on Swift Packages
- Swift Package Index
- swift Package Manager가 지원하는 패키지를 찾는데 도움이 되는 커뮤니티에서 만든 페이지
- Swift 5.5, Xcode 13의 기능으로 패키지를 쉽게 찾고 접근할 수 있는 방법을 제공
- Swift Package Collections
- 선별된 Swift package 목록을 제공하는 Swift Package Collections를 제공함. 이걸 사용하면 더 이상 인터넷에서 패키지를 검색하거나 URL을 복사 붙여 넣기로 추가할 필요가 없음
- Package Collection은 어디서나 게시할 수 있는 JSON 파일이고 선별된 패키지 목록을 제공하기 위한 기능
- New Swift Packages
- 4개의 새로운 패키지를 출시함
>- Swift Algorithms
>- Swift Atomics
>- Swift Collections
>- Swift System
- Swift Collections Package
- Swift에서 사용할 수 있는 자료구조를 확장해주는 패키지

이렇게 3개의 자료구조를 패키지를 사용하면 새롭게 사용 가능하게 해 줌



- Swift Algorithms Package
- Sequence, Collection 알고리즘의 새로운 오픈소스

위에 존재하는 모든 알고리즘을 제공
- Swift System Package
- system call의 저수준 인터페이스를 제공하는 패키지
- Apple, Linux, Window에서 사용할 수 있음
- Swift Numerics Package
- 올해는 Apple Silicon macs에도 Float 16, Flaot 16 복소수를 사용할 수 있게 됨
- 로그, 사인, 코사인과 같은 모든 기능에 대한 복소수를 지원

- Swift ArgumentParser Package

## Update on Swift on server
>서버 개발에서 Swift를 지원하기 위해 진행된 작업들을 소개

- Linux에서 정적 링크를 활성화해서 앱 시작 시간을 단축하고 단일 파일로 배포할 수 있는 서버 앱 배포를 간소화
- Swift 5.5에서는 Linux에서 사용되는 JSON 인코딩 디코딩이 처음부터 다시 구현돼서 성능이 향상
- AWS Lambda 런타임 라이브러리 자체의 성능을 개선하고 최적화
## Developer experience improvements
- Swift 개발자 경험을 개선하기 위해 개발 문서 부분을 개선
- Xcode 13 내부에 통합된 문서 컴파일러인 DocC가 추가됨
- DocC는 마크다운 주석과 같이 이미 알고 있는 도구와 기술을 사용하여 문서를 쉽게 작성할 수 있도록 도와줌
- Build Improvements
- 빌드 속도를 개선하는 작업
- incremental import를 제공
- 해당 모듈이 변경될 때 모듈을 import 하는 모든 소스 파일을 더 이상 빌드하지 않음
- module dependency graph를 미리 계산
- 변경된 항목만 incremental build를 빠르게 시작
- extension과 함께 작동하도록 selective recompilation을 확장
- extension을 사용했을 때 더 적은 수의 재컴파일을 의미
- Memory Management
- 메모리 관리를 보다 효율적으로 개선
- 참조 유지, 해제 작업 수를 크게 줄일 수 있도록 컴파일러 내부에서 참조를 추적하는 새로운 방법을 도입
- Xcode 설정인 Optimize Object Lifetimes를 추가하여 확인 가능
## Ergonomic improvements
- 변경된 내용들

- Result Builders
- 잡한 객체 계층을 빠르고 쉽게 설명할 수 있는 새로운 문법
- Enum Codable synthesis
- enum을 사용한 Codable 구현할 때 기존에는 모든걸 수동으로 구현해야 했는데 이제 Codable 선언만 해주면 가능해짐
- Flexible static member lookup
- Enum과 유사하게 사용할 수 있음
```swift
// 이전 코드
protocol Coffee {}
struct RegularCoffee: Coffee {}
struct Cappuccino: Coffee {}
func brew<CoffeeType: Coffee>(_: CoffeeType) {}
brew(Cappuccino().regular)
// 변경 코드
protocol Coffee {}
struct RegularCoffee: Coffee {}
struct Cappuccino: Coffee {}
extension Coffee where Self == Cappucino {
static var cappucino: Cappucino = { Cappucino() }
}
func brew<CoffeeType: Coffee>(_: CoffeeType) {}
brew(.cappucino.large)
```
- Property wrappers on parameters
- 원래 구조체에 @propertyWrapper 주석을 사용하여 고유한 property wrapper를 구현했는데 이번 업데이트를 통해 동일한 property wrapper를 함수 및 클로저의 매개변수에도 사용 가능하게 바뀜
>예시
```swift
func LogIn(@NonEmpty _ username: String) { ... }
```
> SwiftUI의 개선사항
변경 전
```swift
import SwiftUI
struct SettingsView: View {
@State var settings: [Setting]
private let padding = 10.0
var body: some View {
List(✅0 ..< settings.count) { index in
#if os(macOS)
✅Toggle(settings[index].displayName, isOn: $settings[index].isOn)
.toggleStyle(✅CheckboxToggleStyle())
#else
✅Toggle(settings[index].displayName, isOn: $settings[index].isOn)
.toggleStyle(SwitchToggleStyle())
#endif
}
.padding(CGFloat(padding))
}
}
```
변경 후
```swift
import SwiftUI
struct SettingsView: View {
@State var settings: [Setting]
private let padding = 10.0
var body: some View {
List($settings) { $setting in
Toggle(setting.displayName, isOn: $setting.isOn)
#if os(macOS)
.toggleStyle(.checkbox)
#else
.toggleStyle(.switch)
#endif
}
.padding(padding)
}
}
```
## Asynchronous and concurrent programming
>기존의 코드


하지만 우리가 원하는 것은 그저 "데이터"이다!
>Swift 5.5에서 변한 코드

- async를 메서드 뒤에 붙임으로써 이 함수는 일시 중단을 지원하도록 컴파일되야한다는 것을 알려준다.
- 또 위의 await 코드를 사용함으로써 URLSession이 실행되고 URLSession의 응답이 완료될 때까지 fetchImage 메서드가 일시중지된다. 응답이 완료되면 그 때 함수의 기능이 재개된다.
1. 비동기 메서드는 일시 중단된 동안 리소스를 사용하지 않는다.
2. 스레드를 차단하지도 않기 때문에 Swift 런타임은 이 메서드가 다른 작업을 위해 실행중인 스레드를 재사용할 수 있다.
3. 이를 통해 많은 비동기 프로세스 간 매우 적은 수의 스레드를 공유할 수 있다.
4. 제어흐름이 위 -> 아래로
5. 더이상 중첩된 복잡한 클로저가 필요하지 ❌
6. try/catch 오류 처리 사용 가능
=> 자세한건 WWDC Meet async / await in Swift를 보시라~
## async/await를 사용하는 Swift의 새로운 동시성 지원에 대해 알아보자
>문제 상황

- 3개의 다른 이미지를 렌더링 한 뒤 merge 하는 함수
- 위와 같이 순차적으로 진행되는 코드
- 이전 이미지가 완료된 후에만 시작된다는 문제점이 있음
- 동시에 그려지게 하려면?
>개선


- async let 구문을 사용하여 처음 두 작업을 병렬로 실행
- 다른 스레드에서 계산되는 결과를 기다려야하므로 일시 중단할 수 있도록 async 선언
- 해당 값들이 준비될 때까지 merge 작업을 기다릴 수 있도록 await 키워드 사용
- 둘 중 하나의 작업이라도 완료되지 않았다면 함수가 반환되지 않기 때문에 혹시라도 오류가 있으면 반환하기 위한 throws, try 오류처리도 해줌
> 문제 상황
멀티 스레드 환경에서 자주 발생하는 문제 중 하나인 공유자원을 처리하는 문제는 async, await 만으로 해결할 수 없다.

- increment 메서드를 호출할 때마다 counter 업데이트가 필요함
- 다중 스레드 시스템에서는 제대로 작동하지 않음
> 개선 (actor 사용)

- actor 외부에서 actor 메서드 호출시 일반적으로 await을 사용하기 때문에 데이터 손상 위험 없이 actor에서 다른 메서드를 실행할 수 있다.
>데이터를 actor로 패키징함으로써 이 데이터가 동시에 액세스될 것으로 예상하고 Swift 컴파일러와 런타임이 손상이 없도록 액세스를 조정하기를 원한다는 것을 명확하게 진술
## Swift의 미래.. Swift 6
컴파일러가 개발 프로세스 초기에 더 많은 종류의 동시성 실수를 포착하고 이러한 문제를 수정하는 데 더 자세한 오류와 지침을 제공하는 방법을 이미 연구하고 있습니다.
동시성 버그를 완전히 제거하여 비동기 및 동시 프로그래밍을 다른 종류의 프로그래밍보다 복잡하지 않게 만드는 것입니다.