티스토리 뷰

Swift

WWDC 21 ) What‘s new in Swift

Zedd0202 2021. 6. 11. 17:40
반응형

# Swift 5.5

- 지금까지 최고의 릴리즈

- Swift Concurrency를 포함하여 편리/효율/안전하게 concurrent programming을 할 수 있다.

 

# Swift Package Index

Swift Package Index는 Swift Package Manager를 지원하는 패키지를 찾을 수 있도록 커뮤니티에서 만든 페이지 

이제 Swift 5.5 및 Xcode 13에서는 패키지를 훨씬 더 빠르고 쉽게 사용할 수 있도록 Xcode가 지원함.

 

Xcode 12에서는 

이렇게 URL만 입력할 수 있었는데,

Xcode 13에서는 File > Add Package를 누르면

이렇게!!!! Swift Package Manager를 지원하는 Package들의 리스트가 나옴. "Package Collections"라고 부름

우 하단의 Add Package를 누르면

이런식으로 특정 Package만 선택하여 추가할 수도 있음. 

 

아니면

무작정 import하고 에러를 클릭하면

응 개편해

 

# Swift Collection

Introducing Swift Collections 글 참고

 

# DocC

개발자가 Swift 프레임워크 또는 패키지를 사용하는 방법을 가르치는데 도움이 되도록

Xcode 13에 통합된 문서 컴파일러인 DocC 출시.

기존 사용하던 Swift 마크다운 주석으로 만들 수 있기 때문에 사용하기 쉽다. 

DocC는 올해 말에 오픈소스화 될 것.

 

# improvement of the type checker 

Swift 5.5에서는 type checker의 품질 및 성능 향상에 투자. 

"expression too complex" 오류가 더 적게 표시됨

→ 배열 리터컬의 타입 검사 성능 향상 

위와 같은 에러들이 Swift 5.5에서는 안나거나 더 적게 표시될 것.

 

# 증분 빌드 속도를 높이기 위한 3가지 개선 사항

1. incremental imports 지원 == 모듈이 변경 될 때 모듈을 가져오는 모든 소스파일을 더이상 다시 빌드 하지 않음.

2. 모듈 종속성 그래프를 미리 계산하여 변경된 내용만 증분 빌드 == 빠르게 시작 가능

3. extensions과 함께 작동하도록 selective recompilation을 확장했음. == extension의 본문을 변경할 때 재 컴파일이 줄어든다.

 

SwiftDriver 프로젝트를 예로 들어보자. 

Swift 5.5의 incremental imports 사용 && 가져온 모듈이 변경되었을 때

전체 파일 수의 1/10 미만만 다시 컴파일 && 빌드시간 1/3 감소

incremental imports의 성능 향상

==

빌드 성능에 큰 불이익 없이 프로젝트를 모듈화하고 가져온 모듈을 변경할 수 있음을 의미한다.

 

# Memory Management in Swift

메모리 관리가 보다 더 효율적으로 된다. == Swift 프로그램은 메모리를 더 빨리 회수하게 된다.

Swift의 클래스 인스턴스는 ARC를 사용하여 주어진 시간에 특정 객체에 대한 참조 수를 추적한다.

대부분의 경우 이 메모리 관리가 Swift에서만 작동하며 메모리 관리에 대해 직접 생각할 필요가 없음을 나타냄

ARC는 해당 인스턴스가 더이상 필요하지 않을 때 메모리를 자동으로 해제함. 

이를 위해 

Swift 컴파일러는 새 참조가 생성될 때 마다 retain, 새 참조 사용이 중지될 때마다 release 작업을 삽입한다.

올해, 컴파일러가 retain 및 release 작업 수를 크게 줄일 수 있도록 컴파일러 내부에서 참조를 추적하는 새로운 방법 도입. (성능도 더 좋아짐)

ARC 최적화가 코드에 미치는 영향을 알 수 있도록 Xcode Setting에 "Optimize Object Lifetimes"를 넣음.

기본적으로 No인듯? Xcode 13이 릴리즈 되어야 알 수 있겠지만;

 

# asynchronous / concurrent

소프트웨어 프로젝트는 어떤 순서로 실행되는 코드 블록으로 구성됨.

간단한 경우에는 차례대로 실행된다. 

[asynchronous]

네트워킹 API는 비동기(asynchronous) 스타일. 

서버에 요청을 보낸 후 오랜 delay가 있을 수 있다. 

 

[concurrent]

concurrent code는 동시에 실행하려는 코드 블록이 2개 이상 있는 경우. 

이들은 독립적이지만 관련이 있는 작업일 수 있음. 

 

기존 

 

Swift 5.5의 aync / await을 사용하여 개선한 것. 

1. Control flows가 위에서 아래로.

2. nested clsoure가 필요없음

3. try/catch 오류 처리를 사용할 수 있음 (completionHandler로 하면 try catch를 사용할 수 없으니까)

 

Async/await 글에서도 말했듯이 await 키워드는 비동기 메소드가 일시 중단(suspended) 될 수 있는 지점을 나타냄.

이 경우 URLSession을 시작하자 마자 Swift 런타임에 의해 함수가 일시 중지(suspend)된다. 

성공이든 실패든 최종 결과가 준비되면 그 후에야 함수가 재개(resume)됨. 

비동기 함수는 특히 일시 중지된 동안 리소스를 사용하지 않음. 특히 스레드를 차단하지 않음!

→ Swift 런타임은 함수가 다른 작업을 위해 실행중인 스레드를 재사용할 수 있다. 

→ 많은 비동기 프로세스 간에 매우 적은 스레드를 공유할 수 있음. 

 

# Swift's new concurrency support

세가지 다른 이미지를 렌더링한 다음, merge하는 함수임. 

작업은 sequential하게 이루어지므로 background -> foreground -> title 순으로 렌더링 되며 각 이미지는 이전 이미지가 완료된 후에만 시작된다.

하지만 렌더링 작업이 병렬로 발생하게하려면?

다른 쓰레드에서 실행하는 것만으로는 충분하지 않음. 3가지 결과가 모두 나올 때 까지 merge작업을 보류해야하기 때문.

다른 스레드에서 계산되는 결과를 기다려야하는 경우 이 함수를 async로 표시하여 일시중지 할 수 있음.

 

# async let

async let을 사용하면 작업을 병렬로 실행할 수 있음 (= background와 foreground렌더링이 병렬로 진행됨) 

🙋 async let은 변수/상수 초기화와 비슷하게 보인다.

🧑‍💻 본질적으로 그게 다임. 하지만 async let은 결과를 사용하려고 할 때 까지 다른 코드와 병렬로 실행됨.

background와 foreground가 async let으로 초기화되었기 때문에

Swift 런타임은 필요한 경우 해당 값이 준비될 때 까지 merge작업을 중지. 

이를 나타내기 위해 merge앞에 await 키워드를 붙혀줌. 

이 코드에서 가장 중요한 점은, background tasks가 이 함수보다 오래 지속될 수 없다는 것

즉, 이 함수는 두 background task중 하나가 여전히 실행중인 경우 리턴할 수 없음.

만약 오류가 발생하면(= 오류가 throw되면) Swift 런타임은 signal을 보내 조기 완료 할 수 있게 해줌. 

 

# Actor

Swift 5.5에서 새로나온 async / await을 사용하여 여러 쓰레드에서 작업을 쉽게 할 수 있는 방법을 봤는데, 

다른 쓰레드에서 실행한다고 하더라도 개별 쓰레드가 데이터를 공유 할 때 마다 데이터가 일치하지 않거나 손상될 위험이 있음.

Swift의 새로운 actor 구조는 이러한 문제로 부터 데이터를 보호하는데 도움이 된다. 

위와 같은 코드는 다중 쓰레드 시스템에서 제대로 작동하지 않음. 

두 개 이상의 쓰레드가 increment()를 호출하면 corruption이 일어남. 

이 클래스를 Swift Actor로 변경하면 이러한 corruption으로 부터 보호할 수 있음.

wow...class앞에 붙히는것도 아니고 actor로..

Actor는 특정 변경을 수행하는 것이 안전할 때 까지 (데이터 손상(corruption)을 일으킬 수 있는) 작업을 일시 중단하여 작동함.

즉, 일반적으로 Actor외부에서 Actor 메소드를 호출 할 때 await을 함께 사용해야함.

 

Actor는 async / await과도 잘 작동한다.

publish 메소드를 async로 표시하면 네트워크 작업을 기다리는 동안 일시 중단 할 수 있음

일시 중단 된 동안 네트워크 작업이 완료될 때 까지 기다리지 않고, 데이터 손상 위험 없이 이 Actor에서 다른 메소드를 실행할 수 있음.

Actor는 class와 같은 참조 타입이지만, 멀티 쓰레드 환경에서 Actor를 안전하게 사용할 수 있도록 설계되어있음. 

 

데이터를 Actor로 패키징하면 데이터가 동시에 액세스 될 것으로 예상하고

Swift 컴파일러 및 런타임이 corruption을 방지하기 위해 액세스를 조정한다. 

 

# Swift의 미래

Swift 5.5에서 도입한 주요 기능들

1. asynchronous functions

2. structured concurrency

3. actors

가 안전하고 고성능 코드를 생산하기 위한 좋은 기반임. 

Swift 6의 경우, 컴파일러가 동시성 실수를 빨리 포착하고 이러한 문제를 해결하는데 있어서 오류와 지침을 제공하는 방법을 연구중.

🎯 목표 : 가장 일반적인 종류의 동시성 버그를 완전히 제거하여 비동기 및 동시 프로그래밍을 다른 종류의 프로그래밍보다 더 복잡하지 않게 만드는 것.

 

참고

WWDC 21 ) What‘s new in Swift

https://docs.swift.org/swift-book/LanguageGuide/Concurrency.html

반응형

'Swift' 카테고리의 다른 글

Swift ) prefix / suffix  (1) 2021.12.01
Swift 5.5 ) Codable synthesis for enums with associated values  (0) 2021.11.18
Swift 5.4 Released!  (3) 2021.04.28
Introducing Swift Collections  (0) 2021.04.13
dynamicCallable  (0) 2021.03.18