Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- tableView
- collectionview
- Clean Code
- combine
- Refactoring
- UICollectionView
- Xcode
- ios
- ribs
- 리펙토링
- 리펙터링
- Protocol
- UITextView
- 리팩토링
- swift documentation
- 애니메이션
- SWIFT
- HIG
- RxCocoa
- uiscrollview
- Observable
- map
- Human interface guide
- 스위프트
- rxswift
- 클린 코드
- MVVM
- swiftUI
- clean architecture
- uitableview
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 8. WWDC2023 정리 - 스위프트의 새로운 기능 (3) (애플이 Foundation을 공개한 이유, ~Copyable, C++ interop, Actor and concurrency, unownedSerialExcutor) 본문
WWDC 정리/WWDC 2023 정리
[iOS - swift] 8. WWDC2023 정리 - 스위프트의 새로운 기능 (3) (애플이 Foundation을 공개한 이유, ~Copyable, C++ interop, Actor and concurrency, unownedSerialExcutor)
jake-kim 2023. 6. 13. 23:33(1). 스위프트의 새로운 기능 - (조건문이 표현식으로 변경, type check 속도 향상, repeat each 제네릭스)
(2). 스위프트의 새로운 기능 - (Swift Macro 개념, Swift Macro 동작 원리)
(3). 스위프트의 새로운 기능 - 애플이 Foundation을 공개한 이유, ~Copyable, C++ interop, Actor and concurrency, unownedSerialExcutor
애플이 Foundation를 깃에 공개한 이유
- 애플이 swift-foundation 깃에 공개한 이유?
- 애플에서 Swift를 확장성 있도록 가져가기를 원함 (한 예로 C, C++ 저수준 언어로 Swift를 푸시할 수 있음)
- swift-foundation 코드도 Apple 및 Apple이 아닌 플랫폼에서 Foundation의 단일 공유 구현으로 생태계를 구축하기 위해 깃에 공개한 것
Foundation을 확장성 있도록 새롭게 구현한 것
- Swift 코드를 더욱 확장성 있게 쓰기 위해서 애플에서는 Objective-C 및 C코드를 다시 작성해야 했기 때문에 Foundation에도 새로운 구현 요소가 등장
- MacOS Sonoma 및 iOS 17부터 Date, Caldnar, Locale, AttributedString, JSON 인코딩 및 디코딩 관련 Swift 구현이 새롭게 등장
Foundation 업데이트
- Calendar 기능에서 20% 속도 향상
- Date Formatting 속도는 150% 속도 향상
- JSON 디코딩: 200 ~ 500% 속도 향상
- Objective-C 구현에서 swift로의 연결 비용을 줄이는 것뿐만 아닌 새로운 Swift 기반 구현이 더 빠르기 때문
- Ventura에서는 Objective-C 브릿징 비용 때문에 Objective-C에서 직접 enumerateDates를 호출하는 것이 Swift에서 호출하는 것보다 더 빠르지만 Sonama에서는 동일한 기능이 Swift가 약간 더 빠름
~Copyable 타입
- struct에서 deinit 테크닉을 사용하는 테크닉
- struct 값이 범위를 벗어날 때, 마치 class와 같이 deinit 키워드를 사용할 수 있음
ex) 파일 다루는 파일이 class형태인 경우 데이터 정합성 문제가 발생하므로 struct로 선언하고 이 struct에서도 파일을 닫는 메소드가 필요한데, struct에도 deinit과 같은 키워드가 있으면 사용하는쪽에서 close를 따로 호출해주지 않아도 되는 상태
- Swift5.9부터는 ~Copyable을 사용하여 해당 struct가 복사되지 않게끔 강제할 수 있고, deinit 키워드도 사용할 수 있음
- 뿐만 아니라 사용하는 쪽에서 close()를 먼저 호출하고 write()를 호출했을때 컴파일 타임에 오류 메시지를 보여주어 개발 실수도 막아주는 기능도 제공
C++ interop
- swift로 작성하면 C++로 컨버팅 할 수 있음
- Swift 컴파일러는 C++ 문법을 컴파일 할 수 있으므로 C++을 사용할 수 있음
- 벡터와 맵과 같은 C++ 컬렉션도 swift언어에서 사용 가능
C++의 swift코드를 사용하는 원리
- Objective-C와 동일한 메커니즘을 기반으로 동작
- Swift 컴파일러는 Swift API에 대한 것을 분석하여 "generated header"를 생성하는데, 이것은 C++ view를 포함
- 단, Objective-C와 달리 objc 키워드가 달린 swift 클래스만 사용하도록 제한할 필요 없이 모두 C++에서는 API를 직접 사용 가능
- C++은 bridge에 관한 오버헤드 없이 대부분의 Swift 메소드, 속성, init 등 전체 API를 사용할 수 있음
Actor and Concurrency 개념 및 custom actor
- 여러곳에서 사용할 수 있는 동시성 처리 API
- Swift5.9에서는 이제 actor를 준수하지 않은 곳에서도 actor와 같이 쓸 수 있는 유연함을 제공 (아래에서 알아볼 unownedExector에서 내용 계속)
- 추상 모델에는 2가지가 존재
- 1) Tasks
- 어디에서나 실행할 수 있는 순차적인 작업 단위
- 프로그램에 'await'가 있을 때마다 작업을 일시 중지한 다음 작업을 계속할 수 있게 되면 다시 시작할 수 있는 기능
- 2) Actors
- mutually-exclusive한 엑세스를 제공하는 동기화 메커니즘
- 외부에서 엑터를 입력하면 작업을 일시 중지할 수 있으므로 'await'가 필요
- swift의 concurrency 모델은 싱글스레드의 cooperative queue에서 구현됨
- Swift5.9에서는 custom actor를 통해 자체 동기화 메커니즘 구현이 가능
- actor는 기존 환경에 더 유연하게 채택이 가능
ex) database를 관리하는 MyConnection 액터
- actor 키워드를 사용했으므로 DataBase에 대한 동시 액세스가 불가능함을 의미하여 안전한 코드 형태
- 문제점) 만약 DispatchQueue를 사용하는 코드에서 database connection이 필요할 때, DispatchQueue에서 사용하는 다른 코드는 actor를 채택하지 않았을 때 결국 actor인 코드와 actor가 아닌 코드가 같이 사용되게 되어 문제가 발생할 수 있음
- Swift5.9에서부터 custom actor를 사용할 수 있으므로 이 테크닉을 통해 문제점 해결이 가능
- actor에 DispatchSerialQueue를 추가하고, 해당 큐의 executor를 반환하는 unownedExecutor 프로퍼티를 추가
- * nonisolated 키워드 - actor 외부에서 해당 프로퍼티를 참조할 수 있으며, actor 내부에서 동시성을 깨지 않고 작업을 수행할 수 있도록 하는 기능
- unownedExecutor의 역할
- actor에 관한 모든 synchronization은 unownedExecutor 프로퍼티인 큐에서 발생하게됨
- actor 외부에서 await pruneOldEntries에 대한 호출을 하면, unownedExecutor에 의해서 disaptch-async를 수행함
- 이 테크닉은 Objective-C나 C++로 작성된 형태이기 때문에, 아직 actor를 제공하지 않는 다른 코드에서도 actor를 사용할 수 있게 해주는 코드의 유연함을 제공
- DispatchQueue가 새로운 SerialExecutor 프로토콜을 준수하기 때문에 DispatchQueue를 통한 actor 동기화가 가능하다는 의미
- unownedSerialExcutor의 의미
- reference counting을 늘리는 오버헤드 없이 최적화로 동작
* 참고
'WWDC 정리 > WWDC 2023 정리' 카테고리의 다른 글
Comments