티스토리 뷰
# 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으로 부터 보호할 수 있음.
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의 경우, 컴파일러가 동시성 실수를 빨리 포착하고 이러한 문제를 해결하는데 있어서 오류와 지침을 제공하는 방법을 연구중.
🎯 목표 : 가장 일반적인 종류의 동시성 버그를 완전히 제거하여 비동기 및 동시 프로그래밍을 다른 종류의 프로그래밍보다 더 복잡하지 않게 만드는 것.
참고
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 |
- 회고
- 스위프트
- actor
- IOS
- Combine
- swift 공부
- np-hard
- swift delegate
- fastlane
- SwiftUI
- swift3
- swift sort
- Git
- WidgetKit
- FLUTTER
- WWDC
- iOS delegate
- WKWebView
- ios 13
- github
- Swift
- 피아노
- swift array
- 제이슨 파싱
- 스위프트 문법
- Accessibility
- np-complete
- UIBezierPath
- Xcode
- swift tutorial
- Total
- Today
- Yesterday