본문 바로가기
WWDC

WWDC 21 - What’s new in Swift 5.5

by vapor3965 2021. 6. 16.

목차


    • 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻

     

     

    요약

    • Swift Package Collection을통해 더 쉽게 swift package들을 찾을수있다.
    • Swift DocC를 통하여 더 쉽게 문서들을 작성 및 공유할수있다.
      • 자세한건 다른 DocC session참조
    • Swift는 타입체커기느을 더 강화했다.
      • SwiftUI에서 크게 코드가 간략해졌다.
    • Swift는 증분빌드를 더 개선했다.
      • SwiftDriver ? - swift 언어로작성된컴파일러??? 가 바탕이되었기때문??
    • ARC가 더새로운방법을 사용하여 기존의 retain,release코드구문을 획기적으로줄였다.
      • Xcode - settings - Optimize Object Lifetime을 Yes로 하면 체감할수있다.
    • Property wrapper가 이제는 함수,클로저의 매개변수로사용이가능해졌다.
    • 👍async, concurrency를 위한, 새로운 기능이추가됐다.
      • 이제 dataTask는 completionClosure를 사용하지않고, data,response로 반환하도록한다.
      • async - 메서드가 비동기적으로 수행된다고 알린다. ( 메서드정의에서 작성한다 )
      • await - 해당메서드가 비동기적으로 수행될수있도록 알린다.
      • async let - 병렬적으로수행하라는 메서드의 반환을나타낸다?
      • await merge - 포함된작업들을 모두 완료될때까지 기다린다?

     

    • 👍actor 타입
      • 멀티쓰레드에서 동시적으로접근을 기대하면서, 그에따른 문제가발생하지않도록 하기위한 타입이다.
      • 클래스처럼 참조타입이다.
        • 자세한건 actos session참고,

     

     

     

     

     

     


    Swift5.5, Xcode13에서, packages접근하기위한 추가적인방법들을 제공한다.

    Swift Package Collections에서는, 더이상 인터넷에서 찾아보지않고도 리스트들을 찾을수있다.



    더자세한방법은 wwdc 세션을 확인하라. 

    • swift.org/blog/package-collections

    추가적으로 4개의 오픈소스들을 launch했다.

    ( 음, 아마 표준라이브러리가 됐다라는 의미는 아닌 것 같아요. Xcode 13 베타버전 설치해봤는데 바로 뜨진않는거보니까.. 

    대신 그래도 검색어가 바로 뜨도록 되어있어요! ) 

    ( 그리고 바로 search까지 ....가능.. !! ) 

     

     

     

    SwiftCollections


    Deque


    OrderedSet

    • random access을가능하게해준다.

     

    OrderedDictionary

    • random access가능하게해준다.

     

     

     

    Swift Algorithms

    • 순열,조합 등등

    Collections, Algorithms 에대한 더 자세한정보는 다음 세션참고,


    Swift Systems

    • 시스템콜을위한 자연스러우면서 낮은수준의 인터페이스,

    Server 를위한 Swift

     

     

     

    Swift DocC

    • 컴파일러 문서 - Xcode13과 통합된, Swift framework, package를 어떻게사용하는지를 도와줄수있는.
    • 이것을통해 손쉽게 문서를 작성하고 공유할수있다.
    • 마크다운으로 쉽게 작성이가능하다.

      더자세한건 session확인

     

     

     

     

    Swift5.5에서는 타입체커기능을 더 강화했다.

    • 이제는 아래와같은 컴파일러에러를 더 안볼수있게될것이다.

     

     

     

     

    크게 3가지부분을 개선하여 증분빌드를 높임으로써, 생산성을 높였다.

    첫번째, incremental imports

    • 모듈이 바뀌어도, 더이상 모든소스파일을 리빌드를하지않는다?
      모듈의존성을 더빠르게계산한다
      리컴파일을 더줄였다.

    이렇게 획기적으로 리컴파일을 줄어들었따.

    리빌드시간은 3/1 줄어들었다.

    🔥🧐 이러한 개선이가능한것은 컴파일러가 Swift로 작성되어졌기때문이다?
    이것을 SwiftDriver이라한다. 이 프로그램은 Swift 언어로 컴파일하는것 .
    2019년부터시작하여, Xcode13 에서는 default로 Swift 컴파일할때는 Swift Driver를 사용한다?

    • And by the way, some of these performance improvements were made possible by an important milestone for the Swift project, the first part of the compiler to be written in Swift. This is the Swift Driver, the program that coordinates the compilation of Swift source code. This project began in late 2019 and, as of Xcode 13, is now the default for Swift compilation.

     

     

     

     

    메모리관리

    class타입은 ARC ( 얼크) 에의해 관리된다.

    • Swift 컴파일러가 retain, release 구문을 삽입한다.

    👍하지만, 이번해에, 컴파일러가 참조를추적하기이한 새로운방법을 도입했으며, 이는 획기적으로 retain, release operations들을 줄여줬다.

    • 이를 사용하기위해서는 Xcode setting에서, Optimize Object Lifetime을 Yes로 하면된다.
    • 즉, 더 공격적인 ARC최적화이다.
    • 자세한건 session참고,

     

     

     

     

     

     

     

    




    swift - 개선점
    SE - Swift Evolution


    Enum Codable

    • 기존에는 boilerplate를 작성해야했다.
    • 하지만 이제는 알아서해준다.

    ( 짜잔~! ) 


     

     

     

    👍이제 Property wrapper는 함수, 클로저의 매개변수로써도 사용이가능해졌다.!

     

     

     

     

    개선된 타입체커로인해 SwiftUI코드 리팩토링

    • 같은 Toggle이사용됐지만, 각플랫폼에따라 스타일을 다르ㅔㄱ지정해싿. - 똑같은코드가작성됐다.

    • 👍 이제는 이렇게 스타일만 플랫폼마다 로 나눌수있다.

    • 👍 또한, 매번 settings를 인덱싱했는데, 이제는 직접적으로 $로전달할수있다!!

     

    👍이제는, Double과 CGFloat의 전환을 없애주었따!!


     

    👍Swift - Async, concurrency

    비동기는 다음코드가 바로실행되지않을수있는것 ( 중단되어질수있는것 )
    동시성은 두개이상의 코드블록이 동시에실행되어지는것.

    Swift의 새로운기능을사용하지않고, 비동기작업을 해보자.
    dataTask는 비동기메서드다.

    • 탈출클로저는 try, catch구문의 에러핸들링을 할수가없다.

    이제는, Swift 5.5에서는, 이렇게, data 와 response만을 return하도록 바뀌었고, 그럼으로써, 우리는 에러핸들링을할수가 있다.

    또한, 우리는 컴파일러에게 이 메서드가 중단될수있다는 것을 알려야한다. -👍 await

    즉, 이렇게 바꿀수가있다.
    await를 통해 해당메서드가 중단되어질수있다라고 알리고, 이벤트가발생하기전까지 다음코드를 기다리도록 하게알린다.

    • await구문이 중단되어질경우 쓰레드를 블록시키지않는다.
    • 해당메서드를 실행하고있던 쓰레드를 다른 작업을위해 사용하게해준다.

     

     

    👍async - await

    • async를 통해, 이메서드가 suspension지원하도록 컴파일되게 알린다.
    • await를 통해 메서드가 async적으로 콜할수있도록 마킹한다.

      더자세한건 다음세션 참고,

     

     

    concurrency - 동시성

    • 다음은 순차적으로일어나는상태다. 백그라운드,포그라운드,타이틀 랜더링…

    • 대신, 우리는 3가지작업들을 병렬적으로처리하고싶다.
    • 다른쓰레드에서 동작하게하는것은 괜찮지만 충분하지않다 왜냐하면, 세개의결과가 다되었을경우가필요하기때문ㅇ.

    우선 메서드에 async 를 붙여서, 중단되어질수있다고알리고,
    async let 을 이용한다.

    • 이렇게되면 첫번째두번째 작업들이 병렬적으로 실행하라는 의미가된다.

    await merge 를 통해서, 3개의작업들이 준비될때까지 기다리게해준다.

    가장중요한점은, 백그라운드작업은 이 메서드보다 오래살아있을수없다.

    • 🔥음, renderTitle이 error을 반환해도 다른 2개의백그라운드작업을 기다릴것이다 ?
    • 하지만, 시스템은 그렇지않고, 에러가발생하면,다른 두개의백그라운드작업들에게 얼른 끝내라고 요청을 보낸다.
    • ( 더자세한건 session을 확인하라 )
      The most important point about this code is that the background tasks cannot outlive this function.
      Put another way, this function cannot and will not return if either of the two background tasks is still running.
      If an error is thrown from anywhere inside this function,
      the Swift runtime will still wait for the background tasks to complete.
      Here, I've highlighted a try marker that indicates the computation of the title image may throw,
      but the same applies to all thrown errors, even if they occur in a separate thread.
      In order to keep things responsive,
      when there is a thrown error,
      the Swift runtime will signal unfinished tasks to give them a chance to complete early.
      Our session on structured concurrency provides more details, including a full discussion of this cancellation mechanism and more flexible alternatives to the async let syntax I've discussed here. 

     

     

    Swift Actors

    두개이상의 멀티쓰레드에서 자원을공유한다면 얘기치못한문제가발생할수있다.

    • 아래와같은 코드가 문제가있다.

    👍actor 타입!

    를선언함으로써 보호받을수있도록하고, 문제가될만한 기능들을 중지시킨다.
    또한 actor method를 호출할때, 만약 actor바깥에서 이용한다면, await가 필요할것이당
    또한, actor타입은 클래스처럼 참조타입이다.
    멀티쓰레드에서 안전하게 사용하기위한 타입이다.

    • 동시적으로접근을 기대하면서도, 문제가발생하지않도록 하기위함.
      자세한건 session확인

    또한, async, await도 사용이가능하다.

     

    댓글