THIS IS ELLIE

WWDC2021 What's new in Swift 본문

공부/WWDC

WWDC2021 What's new in Swift

Ellie Kim 2021. 6. 11. 09:46

resource: https://developer.apple.com/videos/play/wwdc2021/10192/

스위프트의 새로운 것 What's new in Swift

 

스위프트 커뮤니티 활성화에 대해서. 
다양성은 스위프트 커뮤니티의 핵심 가치입니다.
다양성에 참여하거나 자세한 내용을 알려면 swift.org/diversity를 방문해보세요.

 

스위프트 멘토십 프로그램을 발표했습니다.
스위프트 오픈 소스에 쉽게 참여할 수 있습니다.

 

스위프트 패키지 인덱스가 생겼습니다.

스위프트 패키지 매니저를 지원하는 패키지를 찾을 수 있도록 커뮤니티에서 만든 페이지입니다.
패키지를 찾는데 수월할 것입니다. (Swift 5.5 및 Xcode13에서 서포트)

 

Swift Package Collections를 소개합니다.

(커맨드 라인과 Xcode 13에서 사용할 수 있음)
패키지 컬렉션을 사용하면 더 이상 인터넷에서 패키지를 검색하거나 URL을 복사해 붙여 넣을 필요가 없습니다. 

  • 누구든지 만들 수 있음 (JSON파일)
  • use cases에 맞는 다양한 패키지 리스트 구성

더 듣고 싶으면 Discover and curate Swift packages using collections(WWDC21)를 찾아보세요. 
직접 사용해보고 싶다면 깃헙에 Apple이 올려놓은 것 사용하면 됩니다.
더 자세히 알고싶다면 swift.org/blog/package-collections를 확인해주세요.

 

Swift Collections에 대해서 말하겠습니다.
(github.com/apple/swift-collections)
Swift Collections는 Swift Standard Library에서 사용할 수 있는 데이터 구조를 보완해주는 새로운 오픈 소스 데이터 구조 패키지입니다.
Swift Collections의 초기 버전은 가장 많이 요청되는 세 가지 데이터 구조인 Deque, OrderedSet 및 OrderedDictionary에 대한 구현과 함께 제공됩니다.

  • Dequeue

Dequeue는 양쪽 끝에서 효율적인 추가, 삭제를 지원한다는 것 빼고는 Array와 같습니다.

  • OrderedSet

OrderedSet은 Array + Set 느낌
Array처럼 순서를 유지하고 인덱스 접근이 가능합니다.
Set처럼 각 요소가 한 번만 노출됩니다. (중복 불가)

  • OrderedDictionary

순서가 중요하거나 인덱스 접근이 필요할 때 사용하면 됩니다.



Swift Algorithms에 대해서 말하겠습니다.
(github.com/apple/swift-algorithms)
Swift Algorithms는 Sequence, Collection 알고리즘의 새로운 오픈 소스 패키지입니다.

(이미 40개 넘는 알고리즘을 Swift Algorithms에 추가되어 있음)
더 자세히 알고 싶다면 Meet the Swift Algorithms and Collections packes (WWDC21)에서 확인하세요.

 

Swift System에 대해서 말하겠습니다.
(github.com/apple/swift-system)
시스템은 Apple 플랫폼, Linux, Windows에서도 사용할 수 있습니다. 

 

Swift Numerics에 대해 이야기하겠습니다.
(github.com/apple/swift-numerics)

작년에 iOS, tvOS 및 watchOS에 Float16을 추가했습니다.
올해 Apple Silicon Mac에 Float16을 지원하고 Float16 기반 (complex number) 복소수 만드는 기능을 추가했습니다. (로그, 사인 및 코사인 등 지원) Swift로 구현되어있기 때문에 기존의 C 라이브러리보다 더 효율적이고 최적화 가능합니다.

 

Swift ArgumentParser에 대해 이야기하겠습니다.
(github.com/apple/swift-argument-parser)

  • Fish shell을 위한 코드 완성 스크립트
  • 짧은 옵션들 결합 (-Ddebug)
  • 에러 메세지 개선

 

Swift Server에 대해서 이야기하겠습니다.

  • Linux에서의 정적 링크
  • JSON 성능 개선
  • AWS Lambda 런타임 개선 및 최적화

이러한 개선 작업들로 인해서 AWS Lambda에서 실행되는 스위프트 프로그램이 33% 더 빠르게 시작되고 AWS API Gateway를 통해 라우팅 되는 lambda호출 시간이 40%나 더 빨라졌습니다.
(또 async / await 모델 사용하도록 리팩토링함)

 

Swift DocC에 대해서 소개하겠습니다.
Swift DocC를 통해 좋은 문서를 작성하고 공유하는 것이 쉬워졌습니다.
마크 다운 주석과 같이 이미 알고 좋아하는 툴과 기술들을 사용하여 구축되어 문서를 쉽게 작성하고 비교할 수 있습니다.
더 자세히는 (Meet DocC documentation in Xcode, Elevate your DocC documentation in Xcode, Host and automate your DocC documentation, Build interactive tutorials using DocC) 여기 세션들에서 확인할 수 있습니다.

 

Swift 5.5에서 타입 검사하는 것의 품질과 성능 향상에 투자했습니다.

그 결과 컴파일할 때 ‘The compiler is unable to type-check this expression in reasonable time’ 에러가 적게 표시됩니다.

 

빌드 속도 향상

  • faster builds when changing imported modules
  • faster startup time before launching compiles
  • fewer recompilations after changing an extension body

모듈이 변경될 때 모듈을 가져오는 모든 소스파일을 빌드하지 않으며, 그래프를 미리 계산해 변경된 내용만 빌드하고 body를 변경할 때 다시 컴파일하는 것이 줍니다. (선택적 빌드)

 

Swift Memory Management에 대해서 이야기하겠습니다.
Swift클래스 인스턴스는 ARC를 사용해 특정 객체에 대한 reference count를 트래킹 합니다. 대부분은 메모리 관리에 대해 직접적으로 고민할 필요가 없습니다. ARC는 해당 인스턴스가 더 이상 필요하지 않을 때 클래스 인스턴스에서 사용하는 메모리를 자동으로 해지합니다. 

새로운 reference가 생성될 때마다 retain을 해주고 새로운 reference가 사용되지 않을 때마다 release를 해줍니다. 이제는 컴파일러 내부에서 reference를 트랙킹하는 새로운 방법을 추가했습니다.

Xcode setting에 Optimize Object Lifetimes에 보면 있어요.
더 궁금하면 ARC in Swift: Basics and beyond세션을 확인해주세요.

 

중간에 자잘한 변경 거리가 나옴

  • Multiple variadic parameters
  • Implicit member chains
  • Result Builders
  • Property wrappers on parameters
  • Codable synthesis for associated value enums
  • Static member lookup in generic contexts
  • Interchangeable use of CGFloat and Double
  • #if for postfix member expressions

 

Asynchronous and concurrent programming에 대해서
먼저 asynchronous와 concurrent가 의미하는 바를 간략하게 설명하겠습니다.

소프트웨어 프로젝트는 코드 블록으로 구성되며 어떤 순서로 실행됩니다. 
(왼쪽) 간단한 경우에는 이러한 블록 차례로 실행됩니다. 
(중간) 그러나 다른 구조도 일반적입니다. 예를 들어 네트워킹 API는 asynchronous로 디자인됩니다. 서버에 API를 요청 후 응답을 받고 작업을 수행해야 할 때까지 오랜 지연이 있을 수 있습니다. 
(오른쪽) 그와 다르게 concurrent 코드는 동시에 실행하는 코드 블록이 두 개 이상 있는 경우입니다. 

위 코드는 이번 새로운 기능을 사용하지 않은 것입니다. (URLSession클래스를 통한 네트워크 호출)
어색한 순서.ㅇ. 
그러나 새롭게 생긴 await를 쓰면

위에서 아래인 flow에 더 이상 클로저 내에 클로저(중복) 클로저가 필요하지 않으며 try / catch로 에러 처리를 할 수 있습니다.
await 키워드는 fetchImage함수가 중지될 수 있다는 것을 표현합니다. 

URLSession은 request를 하자마자 스위프트 런타임에 의해 함수가 일시 중단됩니다. 성공이든 실패든 결과가 온 이후에 함수가 다시 시작됩니다. 비동기 함수는 일시 중단된 동안 리소스를 사용하지 않습니다. (특히 스레드를 차단하지 않음)

더 자세히 알고 싶으면 Meet async/await in Swift, Swift concurrency: Behind the scnes을 살펴보세요. 

다음은 세 가지 다른 이미지를 렌더링 한 다음 결합하는 함수입니다. 

background, foreground, title 순차적으로 렌더링 되며 각 이미지는 이전 이미지가 완료된 후 시작됩니다. 

렌더링 작업이 병렬로 작업되기를 원합니다. 
그러나 다른 스레드에서 실행하는 것으로도 충분하지 않습니다. 
세 결과 모두 나올 때까지 merge작업도 기다려야 합니다.

그래서 다른 스레드에서 계산 결과를 기다려야 할 경우 중지할 수 있도록 함수에 async를 표시해야 합니다.
다음으로 async let을 사용해 background, foreground작업을 병렬로 실행합니다.

async let은 결과를 사용하려고 할 때까지 다른 코드와 병렬로 실행됩니다. 
스위프트 런타임은 해당 값이 준비될 때까지 merge작업을 중지합니다.
await 키워드로 merge 함수를 표시합니다.
background tasks들이 merge 함수보다 오래 지속될 수 없습니다.

Actors

다중 스레드 시스템에서 카운터를 업데이트한다면 불행히도 이 코드는 알맞게 동작하지 않습니다.

Actor는 데이터를 손상할 수 있는 작업을 중단하고 안전할 때 변경을 수행합니다.
일반적으로 Actor외부에서 Actor 메서드를 호출할 때 await를 사용해야 합니다.
Actor는 async / await와도 잘 됩니다.
Actor는 클래스와 같은 reference 타입이지만 멀티스레드에서 안전하게 사용할 수 있도록 설계되어 있습니다.

더 자세히 알고 싶다면 Protect mutable state with Swift actors를 살펴보세요.

반응형

'공부 > WWDC' 카테고리의 다른 글

WWDC2021 ARC in Swift: Basics and beyond  (5) 2022.02.20
WWDC2020 Master Picture in Picture on tvOS  (0) 2020.10.18
Apple 이벤트 2020  (0) 2020.09.23
WWDC2020 Become a Simulator Export  (0) 2020.08.12
WWDC2020 What's New in Swift  (0) 2020.06.30