Swift

Swift 6.1

GREEN.1229 2025. 4. 25. 18:00

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

이번 포스팅에서는 Swift 6.1 릴리즈 사항에 대해 한번 알아보려고 합니다 🙋🏻

 

공식 Swift.org의 블로그에서 Swift 6.1에 대한 소개를 바탕으로 정리합니다.

 

제 나름대로 번역 및 요약 정리를 하기에 혹시 잘못된 부분이 있다면 알려주세요 🙇🏻

개인적으로 정리해본거라 단순한 번역본은 아닙니다.

 

 

Swift 6.1 Released

Swift 6.1 is now available!

www.swift.org

 

실제 원문을 가지고 해석하고 싶다면 위 링크를 참고해주세요!


Swift 6.1

Swift 6.1은 언어 및 표준 라이브러리, 동시성 모델, 패키지 관리, 테스팅, 문서화 도구까지 다양한 측면에서 생산성과 안정성을 향상시켰습니다.

 

그럼 하나씩 알아볼까요?

 


Concurrency: nonisolated 확장 및 Task Group 개선


nonisolated 확장 지원

이제는 nonisolated 키워드를 타입 및 익스텐션 수준에서도 사용할 수 있어요.

예를 들어서 @MainActor가 적용된 타입에서 특정 extension을 비동기로 안전하게 사용할 수 있게 해줍니다.

 

@MainActor
struct S {
  let id: Int
  let name: String
}

nonisolated extension S: CustomStringConvertible, Equatable {
  var description: String {
    "id: \(id), name: \(name)"
  }

  static func ==(lhs: S, rhs: S) -> Bool {
    lhs.id == rhs.id
  }
}

 


Task Group 타입 추론 개선

이전까지는 withTaskGroup(of: Type.self)와 같이 명시적으로 타입을 지정해줘야 했지만, 이제 Swift 6.1에서는 타입 추론이 가능해졌습니다.

 

let messages = await withTaskGroup { group in
  for id in ids {
    group.addTask { await downloadMessage(for: id) }
  }

  var messages: [Message] = []
  for await message in group {
    messages.append(message)
  }
  return messages
}

 


Objective-C 타입 구현 지원 - @implementation

Objective-C의 @implementation 블록을 Swift에서도 구현할 수 있게 @objc @implementation 조합이 도입되었습니다.

 

@objc class MyObjCClass: NSObject {
  @objc func sayHello() {}
}

@objc @implementation
extension MyObjCClass {
  func sayHello() {
    print("Hello from Swift!")
  }
}

 

Objective-C 클래스의 구현을 Swift에서 하나씩 포팅할 수 있어서 기존 Objective-C 코드와 호환성을 유지하면서 점진적으로 Swift 마이그레이션이 용이해졌습니다.

 


생산성 향상 - Trailing Comma 지원

기존에 배열, 딕셔너리 드엥서만 허용되던 trailing comma가 다양한 문법 요소에 확장 적용되었습니다.

Tuple, Parameter/Argument, Generic Parameter, Closure Capture List, ...에 적용됩니다.

 

let numbers = [1, 2, 3, 4,]

let tuple = (
  a: 1,
  b: 2,
)

let result = closure(a, b,)

 

이 변경으로 인해 코드 수정 시 diff 최소화 및 코드 생성 간소화 등의 이점을 가져갑니다.

 


패키지 및 빌드 개선 - Package Traits & Improve Indexing


Package Traits

이제 SPM에서 패키지 특성(traits)를 정의할 수 있어서 특정 환경(WebAssembly, Embedded 등)에 따라 API나 의존성을 다르게 설정할 수 있습니다.

 

.package(
  url: "https://github.com/Org/SomePackage.git",
  from: "1.0.0",
  traits: [
    .default, // 기본 trait 사용
    "Embedded" // 추가 trait
  ]
)

 


Support Background Indexing

SPM 프로젝트는 이제 SourceKit-LSP를 통해 백그라운드 인덱싱이 기본적으로 활성화됩니다.

즉, 빌드하지 않아도 IDE 기능들이 더 빠르게 반영됩니다.

 


Swift Testing - Test Trait 및 예외 핸들링 개선


TestScoping을 활용한 Trait 기반 테스트 설정

이제 커스텀 TestTrait을 통해서 테스트 전후의 공통 로직들을 공유할 수 있습니다.

 

struct MockAPICredentialsTrait: TestTrait, TestScoping {
  func provideScope(for test: Test, testCase: Test.Case?, performing function: @Sendable () async throws -> Void) async throws {
    let mockCredentials = APICredentials(apiKey: "fake")
    try await APICredentials.$current.withValue(mockCredentials) {
      try await function()
    }
  }
}

@Test(.mockAPICredentials)
func testAPIRequest() {
  // APICredentials.current를 이용한 검증
}

 


Improve #expect(throws:) & #require(throws:) 

이제 해당 매크로들이 발생한 에러를 반환하여 테스트 내 에러를 직접 검증하는것이 가능합니다.

 


Improve Swift-DocC - 오버로드 함수 문서화 간소화

DocC에서 함수 오버로드 문서화 시 복잡한 해시 없이도 함수 시그니처로 링크를 지정할 수 있어요.

 

// 기존: [doSomething-3c5j](...)
/// → 사람이 이해 불가능한 해시

// Swift 6.1: [doSomething(first: String?, second: Int) -> Float](...)

 

DocC가 애매한 링크에 대해 경고를 출력해 이를 통해 최소한의 명시로 링크의 명확성이 높아집니다.

 


Conclusion

Swift 6.1은 문법 개선뿐 아니라 테스팅, 패키지 관리, 문서화 도구 등 전반적인 생태계의 발전을 반영하고 있습니다.

특히나 nonisolated의 확장 적용, Task Group의 타입 추론, 테스트 범위 지정 그리고 DocC의 링크 개선은 실무에 즉각 적용 가능한 변화들이라고 보여집니다.

빠르게 발전하는 Swift를 하나씩 익혀보고 프로젝트에 새로운 기능들을 적극적으로 활용하면 좋겠네요 😃

 


References

 

Swift 6.1 Released

Swift 6.1 is now available!

www.swift.org