Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 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가 약간 더 빠름

Ventrura에서는 Objective-C에서 더 빠름

~Copyable 타입

  • struct에서 deinit 테크닉을 사용하는 테크닉
    • struct 값이 범위를 벗어날 때, 마치 class와 같이 deinit 키워드를 사용할 수 있음

ex) 파일 다루는 파일이 class형태인 경우 데이터 정합성 문제가 발생하므로 struct로 선언하고 이 struct에서도 파일을 닫는 메소드가 필요한데, struct에도 deinit과 같은 키워드가 있으면 사용하는쪽에서 close를 따로 호출해주지 않아도 되는 상태

  • Swift5.9부터는 ~Copyable을 사용하여 해당 struct가 복사되지 않게끔 강제할 수 있고, deinit 키워드도 사용할 수 있음

struct에서는 deinit을 원래 사용 못하지만 ~Copyable을 통해 사용이 가능

  • 뿐만 아니라 사용하는 쪽에서 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 동기화가 가능하다는 의미

DispatchQueue는 SerialExecutor를 준수함

  • unownedSerialExcutor의 의미
    • reference counting을 늘리는 오버헤드 없이 최적화로 동작

* 참고

https://developer.apple.com/videos/play/wwdc2023/10164/

Comments