ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 6.2
    Swift 2025. 10. 2. 06:49

    안녕하세요. 그린입니다 🍏

     

    조금 전이지만 9월에 Swift 6.2가 출시되었습니다!

     

    이번 릴리즈는 모든 Swift 개발자의 생산성을 향상시키는 데 초점을 맞춘 업데이트입니다.

    언어 개선부터 툴링, 라이브러리, 그리고 플랫폼 지원까지 실무 개발에 필요한 광범위한 기능들이 추가되었습니다.

    이번 포스팅에서는 Swift 6.2의 주요 변경사항들을 하나씩 살펴보려고 합니다 🙋🏻


    Approachable Concurrency

    Swift 6.2에서 가장 눈에 띄는 변화는 동시성 프로그래밍의 진입장벽을 낮춘 것입니다.

    이번 업데이트는 보일러플레이트 코드를 줄이고 안전한 동시성 코드를 더 자연스럽게 작성할 수 있도록 설계되었습니다.

     

    기본적으로 싱글 스레드 실행

    이제 명시적인 @MainActor 어노테이션 없이도 메인 스레드에서 코드를 실행할 수 있습니다.

    새로운 옵션을 통해 기본적으로 메인 액터에 격리된 코드를 작성할 수 있으며, 이는 스크립트, UI 코드, 그리고 다른 실행 가능한 타겟에 이상적입니다.


    직관적인 async 함수

    가변 상태에 대한 동시 접근 없이 async 코드를 작성할 수 있게 되었습니다.

    이전에는 nonisolated async 메서드가 항상 동시 스레드 풀을 관리하는 글로벌 실행자로 전환되어, 클래스 타입에 대한 async 메서드를 데이터 레이스 안전 오류 없이 작성하기 어려웠습니다.

    Swift 6.2에서는 async 함수가 호출자의 실행 컨텍스트에서 실행되는 방식으로 마이그레이션할 수 있습니다.

    메인 액터에서 호출되더라도 자연스럽게 동작합니다.


    @concurrent로 동시성 옵트인

    새로운 @concurrent 속성을 통해 동시에 실행되는 코드를 명확하게 표시할 수 있습니다. 이

    를 통해 코드가 액터에서 직렬화된 상태로 유지될 때와 병렬로 실행될 수 있을 때를 명확히 구분할 수 있습니다.

    // '-default-isolation MainActor' 모드에서
    struct Image {
        // 이미지 캐시는 메인 액터로 보호되므로 안전합니다
        static var cachedImage: [URL: Image] = [:]
        
        static func create(from url: URL) async throws -> Image {
            if let image = cachedImage[url] {
                return image
            }
            let image = try await fetchImage(at: url)
            cachedImage[url] = image
            return image
        }
        
        // 주어진 URL에서 데이터를 가져오고 디코딩합니다.
        // 이 작업은 동시 스레드 풀에서 수행되어
        // 큰 이미지를 디코딩하는 동안 메인 액터를 자유롭게 유지합니다.
        @concurrent
        static func fetchImage(at url: URL) async throws -> Image {
            let (data, _) = try await URLSession.shared.data(from: url)
            return await decode(data: data)
        }
    }


    이러한 개선사항들은 어노테이션 오버헤드를 줄이면서 데이터 레이스가 없는 코드를 작성할 수 있게 하고, async 코드에 대해 더욱 예측 가능한 동작을 제공하며, 필요할 때 동시성을 도입할 수 있도록 합니다.


    Safe Systems Programming

    Swift 6.2는 안전성을 희생하지 않으면서 성능을 극대화하도록 설계된 기능들을 포함합니다.

    이러한 기능들은 예측 가능한 성능과 최소한의 오버헤드로 안전한 로우레벨 코드를 작성하는 데 도움이 됩니다.

     

    InlineArray

    InlineArray는 요소에 대한 인라인 스토리지를 가진 새로운 고정 크기 배열입니다.

    추가적인 힙 할당 없이 스택이나 다른 타입 내부에 직접 저장될 수 있습니다.

    인라인 배열은 요소 앞에 꺾쇠 괄호로 크기를 작성하거나 of 단축 구문을 사용하여 도입할 수 있습니다.

    struct Game {
        // InlineArray<40, Sprite>의 단축 표현
        var bricks: [40 of Sprite]
        
        init(_ brickSprite: Sprite) {
            bricks = .init(repeating: brickSprite)
        }
    }

    Span

    새로운 Span 타입은 연속된 메모리에 대한 안전하고 직접적인 접근을 제공합니다.

    Span은 사용 중에 메모리가 유효한 상태로 유지되도록 보장하여 메모리 안전성을 유지합니다.

    이러한 보장은 런타임 오버헤드 없이 컴파일 타임에 검사되며, use-after-free 버그와 같이 포인터에 내재된 메모리 안전성 문제를 근본적으로 해결합니다.


    추가 로우레벨 기능 강화

    • Embedded Swift: Embedded Swift가 이제 Swift의 전체 String API, 클래스 제약 프로토콜용 any 타입, 그리고 새로운 InlineArray와 Span 타입을 포함합니다.
    • 안전한 C++ 상호운용성: Swift와 C++를 혼합하는 프로젝트는 헤더 어노테이션을 통해 C++ API에 대한 Span과 같은 Swift의 안전한 추상화를 활용할 수 있습니다.
    • 옵트인 엄격한 메모리 안전성: Swift 6.2는 옵트인 엄격한 메모리 안전성을 도입하여, 불안전한 포인터와 같은 unsafe 구문 사용을 플래그 처리하므로 안전한 대안으로 교체하거나 소스 코드에서 명시적으로 인정할 수 있습니다. 대부분의 프로젝트는 이 수준의 강제가 필요하지 않기 때문에 옵트인 방식입니다 - 엄격한 메모리 안전성은 가장 강력한 보안 요구사항을 가진 프로젝트에 적합합니다.

    Streamlined Workflows

    언어 개선 외에도 Swift 6.2는 코드 편집, 빌드, 디버깅의 일상적인 반복 주기를 개선합니다.

    VS Code Swift 확장

    VS Code용 Swift 확장이 이제 Swift.org에서 공식적으로 검증되고 배포됩니다.

     

    최신 버전의 확장은 다음을 포함합니다.

    • 기본 백그라운드 인덱싱: 정의로 이동, 코드 완성과 같이 항상 최신 상태를 유지하는 빠른 에디터 기능으로 코드를 작성할 수 있습니다.
    • 내장 LLDB 디버깅: VS Code 내에서 LLDB를 사용하여 Swift 코드를 단계별로 실행하고, 중단점을 설정하고, 상태를 검사할 수 있습니다.
    • Swift 프로젝트 패널: Explorer 뷰에서 Swift 프로젝트의 타겟, 의존성, 작업을 탐색할 수 있습니다.
    • 실시간 DocC 미리보기: 입력하는 대로 실시간으로 업데이트되는 렌더링된 문서를 코드와 나란히 미리 볼 수 있습니다.

    정밀한 경고 제어

    Swift 6.2는 진단 그룹 수준에서 제어할 수 있도록 하여 컴파일러 경고 관리 방식을 개선합니다.

    진단 그룹은 이름으로 식별되는 경고 카테고리입니다.

    Swift 패키지 매니페스트에서 SwiftSetting의 treatWarning 메서드를 사용하거나, treatAllWarnings 메서드를 사용하여 모든 경고를 에러로 승격시킬 수 있습니다.

    .target(
        name: "MyLibrary",
        swiftSettings: [
            .treatAllWarnings(as: .error),
            .treatWarning("DeprecatedDeclaration", as: .warning),
        ]
    )

    매크로 빌드 성능

    Swift 6.2는 매크로 기반 API를 사용하는 프로젝트의 클린 빌드 시간을 크게 개선합니다.

    이전에는 빌드 시스템이 매크로 프로젝트를 빌드하기 전에 먼저 swift-syntax 패키지를 소스에서 가져와 빌드해야 했는데, 이는 특히 CI 환경에서 컴파일 시간을 눈에 띄게 늘렸습니다.

    SwiftPM은 이제 사전 빌드된 swift-syntax 의존성을 지원하여 비용이 많이 드는 빌드 단계를 완전히 제거합니다.


    향상된 async 디버깅

    Swift 6.2는 LLDB로 디버깅할 때 동시성 코드에서 무슨 일이 일어나고 있는지 훨씬 쉽게 추적할 수 있게 합니다.

    • 강력한 async 스테핑: 비동기 호출이 스레드 전환을 필요로 하는 경우에도 LLDB에서 비동기 함수로 안정적으로 단계 진입할 수 있습니다.
    • 작업 컨텍스트 표시: 중단점에서 멈췄을 때와 현재 스레드의 백트레이스를 볼 때 코드가 어떤 작업에서 실행되고 있는지 확인할 수 있습니다.
    • 명명된 작업: 작업을 생성할 때 사람이 읽을 수 있는 이름을 할당할 수 있으며, 이는 디버깅 및 프로파일링 도구의 작업 컨텍스트에 표시됩니다.

    예정된 기능으로의 마이그레이션

    Swift 6.2는 예정된 언어 기능을 채택하는 데 도움이 되는 마이그레이션 도구를 포함합니다.

    • 소스 비호환성 식별: 예정된 기능이 활성화될 때 더 이상 컴파일되지 않거나 동작이 변경될 코드 패턴을 마이그레이션 도구의 경고를 통해 식별합니다.
    • 코드 변경 자동화: 기존 동작을 보존하기 위해 코드를 업데이트하는 수정 제안을 적용합니다.

    이는 수동 코드 변경이라는 지루한 작업을 제거하여 예정된 기능을 활성화하는 프로세스를 간소화합니다.

     


    Core Library Updates

    외부 프로세스를 관리하든, 상태 변경에 반응하든, 테스트 스위트를 작성하든, Swift 6.2 라이브러리는 더 깨끗하고 안전한 코드를 작성하는 데 도움이 되도록 진화하고 있습니다.

     

    Subprocess

    Swift 6.2는 외부 프로세스를 실행하고 관리하기 위한 간소화된 동시성 친화적 API를 제공하는 새로운 Subprocess 패키지를 도입합니다.

    여기에는 async/await로 구축된 API, 프로세스 실행에 대한 세밀한 제어, 플랫폼별 구성 등이 포함되며, 스크립팅, 자동화, 서버 사이드 작업에 이상적입니다.

    import Subprocess
    
    let swiftPath = FilePath("/usr/bin/swift")
    let result = try await run(
        .path(swiftPath),
        arguments: ["--version"]
    )
    let swiftVersion = result.standardOutput
    

    Foundation

    Swift 6.2에서 Foundation 라이브러리는 알림 이름과 페이로드에 대해 문자열과 타입이 지정되지 않은 딕셔너리에 의존하는 대신 구체적인 알림 타입을 사용하는 현대적인 NotificationCenter API를 포함합니다.

    이는 저장된 속성을 가진 알림 구조체를 정의할 수 있으며, 옵저버는 오류가 발생하기 쉬운 인덱싱과 동적 캐스팅 없이 타입을 사용할 수 있음을 의미합니다.

     

    알림 타입은 또한 MainActorMessage 또는 AsyncMessage에 대한 준수를 통해 메인 액터에서 동기적으로 게시되는지 아니면 비동기적으로 게시되는지 지정하여, 메인 액터 알림으로 작업할 때 동시성 오류를 제거합니다.


    Observation

    Swift 6.2는 새로운 Observations async 시퀀스 타입을 사용하여 observable 타입의 트랜잭셔널 상태 변경을 스트리밍할 수 있게 합니다.

    업데이트에는 observable 속성에 대한 모든 동기 변경사항이 포함되며, 트랜잭션은 일시 중단되는 다음 await에서 종료됩니다.

    이는 중복된 UI 업데이트를 방지하고, 성능을 개선하며, 코드가 값의 일관된 스냅샷에 반응하도록 보장합니다.


    Swift Testing

    Swift 6.2의 Swift Testing은 테스트와 테스트 결과의 표현력을 향상시키는 새로운 API를 추가합니다.

    • Exit testing: 실패한 전제조건과 같은 특정 조건에서 코드가 종료되는지 확인할 수 있습니다. exit 테스트는 새로운 프로세스에서 실행되며 종료 동작이 예상대로인지 검증하여, 다른 테스트처럼 중요한 실패 경로를 실행할 수 있게 합니다.
    • Attachments: 테스트 결과에 문자열, 이미지, 로그 및 기타 아티팩트를 포함한 추가 컨텍스트를 포함할 수 있으며, 테스트 리포트에 표시되거나 디스크에 기록됩니다. 이를 통해 UI 상태의 스크린샷, JSON 페이로드 또는 문제로 이어진 단계의 추적과 같은 구체적인 증거로 실패를 진단하기가 더 쉬워집니다.
    • Raw identifier display names: 테스트 함수와 스위트 타입의 이름을 더 적은 코드로 커스터마이즈할 수 있습니다:
    -@Test("square() returns x * x")
    -func squareIsXTimesX() {
    +@Test func `square() returns x * x`() {
        #expect(square(4) == 4 * 4)
    }
    

     


    WebAssembly Support

    Swift 6.2는 WebAssembly(Wasm)에 대한 지원을 얻습니다.

    WebAssembly는 이식성, 보안성, 높은 성능에 초점을 맞춘 가상 머신 플랫폼입니다.

    Wasm용 클라이언트와 서버 애플리케이션을 모두 빌드하고 브라우저나 다른 런타임에 배포할 수 있습니다.

     


    Conclusion

    Swift 6.2는 개발자 생산성을 중심으로 한 의미 있는 업데이트입니다.

     

    주요 개선사항을 정리해볼까요?

    동시성의 접근성 향상

    • 기본 메인 액터 격리로 보일러플레이트 감소
    • 더 직관적인 async 함수 동작
    • @concurrent를 통한 명확한 동시성 옵트인

    안전한 시스템 프로그래밍

    • InlineArray와 Span을 통한 안전한 로우레벨 프로그래밍
    • Embedded Swift의 기능 확장
    • 옵트인 엄격한 메모리 안전성

    개선된 개발 워크플로우

    • 공식 VS Code 확장의 강력한 기능들
    • 정밀한 경고 제어
    • 매크로 빌드 성능 개선
    • 향상된 async 디버깅

    핵심 라이브러리 업데이트

    • 새로운 Subprocess 패키지
    • 현대화된 NotificationCenter API
    • Observations를 통한 상태 변경 스트리밍
    • Swift Testing의 새로운 표현력

    여러분은 Swift 6.2의 어떤 기능이 가장 기대되시나요? 🤔

     


    References

     

    Swift 6.2 Released

    We’re excited to announce Swift 6.2, a release aimed at making every Swift developer more productive, regardless of where or how you write code. From improved tooling and libraries to enhancements in concurrency and performance, Swift 6.2 delivers a broa

    www.swift.org

     

    'Swift' 카테고리의 다른 글

    Iterate Over Parameter Packs  (0) 2025.10.18
    Swift Profile Recorder  (0) 2025.10.12
    Deep Dive @_silgen_name  (1) 2025.09.20
    Swift Collections 내부 구조 분석  (0) 2025.09.06
    Make DSL with ResultBuilder  (4) 2025.08.30
Designed by Tistory.