Swift 6.4 Released
Swift 6.4 출시 — 빌드 시스템 통합과 Subprocess 1.0
Swift 6.4가 출시됐습니다. Swift Package Manager의 기본 빌드 시스템이 Swift Build로 바뀌어 Linux·macOS·Windows에서 동일하게 빌드되고, 서브프로세스 라이브러리 Subprocess가 1.0에 도달했으며, WebAssembly 브릿징은 최대 40배 빨라졌습니다.
- 주제
본문
Swift 6.4가 공식 출시됐습니다. Swift 팀은 이번 릴리스가 앱과 서버부터 시스템 코드, 임베디드 기기, 브라우저까지 '전 스택'을 아우르는 지원을 심화하고 일상적인 코드를 더 쉽게 만들었다고 설명합니다. 가장 큰 변화는 Swift Package Manager(SwiftPM)의 기본 빌드 플랫폼이 Swift Build로 전환돼 Linux, macOS, Windows에서 프로젝트가 같은 방식으로 빌드된다는 점이며, 외부 프로그램을 실행하고 상호작용하는 Subprocess 라이브러리가 1.0 안정 버전에 도달했습니다.
더 단순하고 명확해진 코드
- SE-0521: 옵셔널 some·any 타입에서 괄호가 필요 없어져 (some Rocket)? 대신 some Rocket?처럼 쓸 수 있습니다.
- SE-0522: 새 @diagnose 어트리뷰트로 경고 억제나 에러 승격 같은 경고 동작을 소스 코드 안에서 직접 제어할 수 있습니다.
- SE-0491: 여러 모듈이 같은 API 이름을 제공할 때 :: 셀렉터로 어느 모듈의 심볼인지 명시할 수 있습니다.
- SE-0493: defer 블록 안에서 async 함수를 호출하면 블록이 끝나기 전에 await되고 완료까지 실행됩니다.
- SE-0504: withTaskCancellationShield API로 감싸인 태스크의 취소에서 보호되는 클로저를 실행할 수 있습니다. 블로그는 defer 안에서 shield로 flushMetrics 같은 네트워크 정리 작업이 취소 요청 이후에도 끝까지 실행되도록 하는 예시를 보여줍니다.
코어 라이브러리와 테스트 개선
Foundation의 ProgressManager에 async/await 지원 API가 추가됐고(SF-0023), @Observable 타입은 더 세분화되고 연속적인 변경 알림을 제공합니다(SE-0506). Subprocess는 Swift concurrency를 기반으로 처음부터 설계된 크로스플랫폼 패키지로, Subprocess.run(.name("ls"), arguments: ["-la"], output: .string(limit: 4096))처럼 프로세스를 실행하고 출력을 캡처할 수 있습니다. Swift Testing으로의 마이그레이션도 쉬워져 XCTest 안에서 #expect를, Swift Testing 안에서 XCTAssert를 안전하게 섞어 쓸 수 있고(ST-0021), CustomTestReflectable로 실패 시 표시 값을 커스터마이즈하며(ST-0022), 테스트 반복 실행(ST-0024)과 Transferable 첨부 기록(ST-0023)도 지원합니다. 표준 라이브러리 문서는 오픈소스로 공개됐고 전용 문서 사이트도 생겼습니다.
빌드·디버깅·IDE
디버그 정보에서 Swift 모듈을 추적하는 방식의 다중 릴리스 개편이 완료돼, LLDB가 모호한 이름 기반 조회 대신 정확한 의존성 추적으로 모듈을 가져옵니다. 바이너리 Swift 모듈이 더 이상 포함되지 않아 Linux·Windows의 디버그 빌드와 Darwin의 dSYM 번들 크기가 크게 줄었습니다. SwiftPM은 SBOM(Software Bill of Materials) 생성도 지원해 SPDX 또는 CycloneDX 형식 문서를 만들 수 있습니다(SE-0509). VS Code 확장은 Open VSX Registry에 등록돼 Cursor, Antigravity, Kiro 등 다른 에디터에서도 쓸 수 있고, 툴체인 관리 도구 Swiftly와 통합됐습니다.
상호운용성과 플랫폼 확장
C에서는 @c와 @implementation을 짝지어 별도 C 선언 없이 Swift 함수로 C 헤더의 구현을 제공할 수 있고, Span 기반 안전 래퍼를 생성할 수 있습니다. C++는 C++20의 std::span과 Swift의 Span이 직접 브릿징돼 경계에서 수동 변환 코드가 필요 없습니다. Swift/Java 인터롭은 async·throwing 함수 지원을 프로토콜과 콜백 래퍼로 확장하고, 클로저의 Runnable 자동 매핑, 가변 인자 임포트, Java record 타입을 지원합니다. WebAssembly 쪽에서는 JavaScriptKit의 안전 브릿징이 기존 동적 브릿징 대비 최대 40배 빨라졌고, Wasm SDK를 Swift.org 설치 페이지에서 바로 받을 수 있으며 WASI의 FileManager 지원도 개선됐습니다. Android SDK는 새 LTS NDK 30 기반으로 빌드돼 가용성 어트리뷰트를 제공하고 SwiftPM의 Swift Build가 Android를 지원합니다. Embedded Swift는 any Protocol 같은 existential 타입을 일반화 지원해 이종 컬렉션과 any Error의 throw/catch가 가능해졌고, 타깃 전체에 켤 수 있는 EmbeddedRestrictions 경고가 추가됐습니다.
안전을 유지하며 빠른 코드
borrow·mutate 접근자로 프로퍼티를 통해 Span이나 InlineArray를 복사 없이 읽고 수정할 수 있고(SE-0507), non-copyable 타입이 Equatable·Comparable·Hashable에 conform 가능해졌으며, Ref와 MutableRef로 값 하나씩 빌리거나 변경할 수 있습니다(SE-0519). non-copyable 타입의 Optional도 소비하지 않고 내부를 검사·수정할 수 있습니다(SE-0532). UniqueBox는 참조 카운팅 없이 힙 값을 단독 소유하는 스마트 포인터(SE-0517), UniqueArray는 copy-on-write 할당 없이 non-copyable 요소를 담는 동적 버퍼(SE-0527), Iterable 프로토콜은 Sequence를 넘어 요소를 복사 대신 borrow하며 순회합니다(SE-0516). withTemporaryAllocation은 자동 초기화·정리되는 스크래치 버퍼(SE-0524), RawSpan의 새 안전 로딩 API는 unsafe 표시 함수를 대체합니다(SE-0525).
Lobsters 반응
- @? — Rust 팬으로서 Swift를 지켜보는 것은 재미있으며, Swift는 비슷하게 현대적이지만 원칙에는 훨씬 덜 엄격하고 온갖 '주방 싱크대'식 편의 기능을 기꺼이 받아들인다고 평가합니다. 다만 타입 추론과 서브타이핑 도입으로 한 줄짜리 프로그램도 타입 체크가 지수적으로 폭발해 타임아웃이 발생하는 문제가 있다고 지적합니다.
원문: Swift.org 블로그 / 번역·요약: Trawling