• Swift가 나온지 10주년이 되었고, 올해가 주요한 마일스톤이다.
    • 2014년: WWDC에서 Swift 발표
    • 2015년: Swift2, 오픈소스 발표, 리눅스 지원
    • 2016년: Swift3, SPM 발표
      • 2→3로의 전환은 단절적이였음
    • 2017년: Swift4
      • language mode 지원을 통해서 준비가 되면 마이그레이션 할 수 있도록 했다
    • 2018년: Swift 4.2, 제네릭 개선(조건부 채택 등)
    • 2019년: Swift5
      • 애플 플랫폼에서 ABI 안정성 발표
        • 앱 개발자는 표준 Swift 라이브러리를 앱에 안 넣어도 되어서 다운로드 크기가 더 작아진다.
          • 대신 Swift 표준 라이브러리가 OS의 일부가 되어서 OS별로 최적화가 되고 모든 Swift 앱과 프레임워크가 공유한다.
        • 애플은 이제 Swift를 통해서 더 안전한 API와 프레임워크를 만들 수 있게 되었다.
          • 그래서 나온게 SwiftUI다.
    • 2020년: 커뮤니티를 통해서 Windows로 포팅
    • 2021년: 동시성 지원
    • 2022년: 분산 액터 지원 및 동시성 모델 개선, VS Code 확장 릴리즈
    • 2023년: C++ 상호 운용, 매크로 지원
    • 2024년: Swift6
      • 포팅 능력, 성능, 전체적인 개발자 경험 개선
      • Swift6 language mode 지원
        • 데이터 경합을 컴파일 타임에 막을 수 있게 해줌
  • Swift Project update
    • 커뮤니티 업데이트(링크)
      • 처음에는 Core Team만 있다가 커뮤니티가 커지면서 여러개의 steering group이 생기게 되었다.
      • 올해부터 Platform steering group이 생겨서 여러 곳에서 Swift를 쓸 수 있도록 힘쓸 예정이다.
      • 또한 Ecosystem steering group을 만들어서 개발자 경험과 더 넓은 생태계를 위해서 활동중이다.
      • 저수준 개발을 위해서 Embedded workgroup도 만들고 있다.
    • 웹사이트 개선
      • Website workgroup을 통해서 이뤄짐
      • 크로스 플랫폼 라이브러리 등 다양한 튜토리얼
      • Swift의 다양한 기술을 살펴볼 수 있는 웹서비스
    • packages(링크)
      • swiftPackageIndex.com과 통합됨
        • 여러 언어 버전과 플랫폼용으로 패키지를 빌드해서 올바른 패키지를 선택할 수 있도록 돕는다.
      • 매달 Community Showcase로 패키지를 지정한다.
        • 원하는 패키지가 지명되게 하기 위해서는 포럼에서 의견을 달라
  • Swift Everywhere
    • Swift는 점점 다양한 플랫폼으로 포팅되면서 크로스 플랫폼 언어로 발전하고 있다.
      • 공식지원
        • Apple Platform
        • Linux
        • Windows
      • 커뮤니티 지원
        • WebAssembly
      • 올해부터 리눅스 지원에 Fedora와 Debian이 추가된다.
    • Xcode는 여전히 주요한 Swift용 IDE지만, LSP를 통해서 다른 환경도 지원해오고 있다.
      • VS Code, Neovim, Emacs 등
    • Static Linux SDK for Swift
      • macOS → Linux로의 크로스 컴파일링을 위한 SDK

      • 설치

        swift sdk install ~/preview-static-swift-linux-0.0.1.tar.gz
        
      • 크로스 컴파일

        swift build --swift-sdk aarch64-swift-linux-musl
        
      • 개발 프로세스

        • macOS용으로 개발
        • Linux SDK for Swift 설치
        • macOS에서 Linux용으로 빌드 후 서버에 설치
    • Foundation
      • Foundation은 여러 앱에서 필수적인 API를 제공하는 핵심 프레임워크

        • JSON Decoding, date and time formatting, file system operation 등등
      • OS X 시작부터 있던 가장 오래된 프레임워크들 중 하나

      • Swift가 오픈소스가 되었을 때 이 프레임워크가 모든 플랫폼에 유용하기때문에 swift-corelibs-foundation 프로젝트로 별도 구현을 제공

      • 그 이후 언어가 발전하면서 단일 구현체를 쓸 수 있게 되면서 Swift로 완전히 재작성하는 Swift-Foundation 프로젝트를 시작

        • 일관적인 동작, 더 높은 품질, 더 나은 성능
        • 새로운 기능을 모든 플랫폼에 일관적으로 제공할 수 있게 되었다.

        스크린샷 2024-06-17 오후 12.04.29.png

      • 지난 가을부터 iOS와 macOS에 새로운 foundation이 들어갔다.

        • Objective-C앱도 이 개선의 혜택을 봤다.
      • 오픈소스기 떄문에 커뮤니티에서 기여할 수 있고, 공개된 진화 프로세스를 거치게 된다.

        • Predicate API도 Swift6를 통해서 모든 플랫폼에 제공되게 된다.
      • 올해부터 regex지원도 추가

    • Swift Testing
      • 쉽게 쓸 수 있고, 표현력이 풍부하고, 유연하고 확장 가능하다.

      • 매크로 등의 모던 Swift 기능들을 사용하고, 동시성과도 매끄럽게 연결된다.

      • 오픈소스로 개발되어 크로스 플랫폼을 염두에 두고 만들어졌다.

      • Xcode와 VSCode 등 여러 IDE와 통합을 위해 디자인 되었다.

      • 생태계의 공식이자 기본 테스팅 솔루션이 되는 비전을 가지고 있고 이 비전은 swift-evolution에 문서화되어있다.

      • 예시

        • 테스트 함수 선언

          // Swift Testing 
          
          import Testing
          
          @Test
          func rating() {
              let video = Video(id: 2, name: "Mystery Creek")
              #expect(video.rating == "⭐️⭐️⭐️⭐️")
          }
          
        • 테스트 이름 커스텀

          // Swift Testing 
          
          import Testing
          
          @Test("Recognized rating")
          func rating() {
              let video = Video(id: 2, name: "Mystery Creek")
              #expect(video.rating == "⭐️⭐️⭐️⭐️")
          }
          
        • 태그를 통해서 테스트를 구조화하고 필터링할 수 있다.

          // Swift Testing 
          
          import Testing
          
          @Test("Recognized rating",
                 .tags(.critical))
          func rating() {
              let video = Video(id: 2, name: "Mystery Creek")
              #expect(video.rating == "⭐️⭐️⭐️⭐️")
          }
          
        • 여러가지 매개변수를 지정해서 다양한 입력에 대해서 테스트를 돌려볼 수도 있다.

          // Swift Testing 
          
          import Testing
          
          @Test("Recognized rating",
                 .tags(.critical),
                 arguments: [
                     (1, "A Beach",       "⭐️⭐️⭐️⭐️⭐️"),
                     (2, "Mystery Creek", "⭐️⭐️⭐️⭐️"),
                 ])
          func rating(videoId: Int, videoName: String, expectedRating: String) {
              let video = Video(id: videoId, name: videoName)
              #expect(video.rating == expectedRating)
          }
          
      • 더 자세한 내용은 Meet Swift Testing과 Go Further with Swift Testing 세션 참조

    • Build 개선
    • Swift 프로젝트 마이그레이션
  • Language updates