반응형

Swift 6.0 기능 정리

 

1. 엄격 동시성 (Strict Concurrency by Default)


예시 1 – Sendable 준수 필수화

struct User: Sendable {
   let id: Int
   let name: String
}

func updateUser(_ user: User) async {
   print(user.name)
}

Swift 6에서는 actor 간 전달되는 모든 타입이 Sendable 여야 합니다.

@unchecked Sendable 을 붙여 임시 우회할 수 있지만 경고로 표시됩니다.

예시 2 – Data Race 감지 (컴파일 타임 오류)

var counter = 0

Task {
  counter += 1  // ❌ Swift 6에서는 data race 오류
}

이전 버전에서는 경고였던 항목이 Swift 6 언어 모드에선 컴파일 에러로 승격됩니다.

2. Typed throws (에러 타입 명시)


예시 1 – 지정된 에러 타입

enum NetworkError: Error {
  case invalidURL
  case timeout
}

func fetchData(from url: String) throws(NetworkError) -> Data {
  guard let _ = URL(string: url) else {
    throw .invalidURL
  }
  return Data()
}

do {
  let data = try fetchData(from: "bad-url")
} catch let error as NetworkError {
  print("Network Error:", error)
}

catch 구문에서 에러 타입이 자동으로 추론됩니다.

예시 2 – Never 타입

func parseNumber(_ text: String) throws(Never) -> Int {
  return Int(text)!
}

throws(Never)는 절대 throw 하지 않음을 보장합니다.

3. 매크로 (Macro) 정식 지원


예시 – 커스텀 매크로로 자동 프로퍼티 추가

@attached(member)
macro AddTimestamp() = #externalMacro(module: "CoreMacros", type: "AddTimestampMacro")

@AddTimestamp
struct Message {
  let text: String
}

// 컴파일 후 자동 생성:
extension Message {
  var createdAt: Date { Date() }
}

매크로는 컴파일 타임에 코드 생성, 검증, 자동화 등을 수행할 수 있는 강력한 기능입니다.

4. 비복사 타입 (Non-copyable / ~Copyable)

struct FileHandle: ~Copyable {
  private let descriptor: Int32
  deinit {
    close(descriptor)
  }
}

~Copyable은 값을 복사하지 않고 이동만 허용합니다. 리소스 관리(파일, 락, 버퍼)에 효율적입니다.

5. C++ 상호운용 강화

// C++ 파일
struct Vector3 {
  float x, y, z;
  float length() const { return sqrt(x*x + y*y + z*z); }
};
// Swift 코드
import CXXVectorLib

let v = Vector3(x: 3, y: 4, z: 0)
print(v.length())  // 5.0

Swift 6은 C++ 함수, 클래스, move-only 타입 호출 및 호환성이 개선되었습니다.

6. 동시성 도우미 API (Atomic / Mutex)

import Synchronization

let counter = ManagedAtomic(0)

Task.detached {
  counter.wrappingIncrement(ordering: .relaxed)
}

print(counter.load(ordering: .relaxed))

Synchronization 프레임워크에 포함된 ManagedAtomic, Mutex 등으로 락 없이 안전한 연산이 가능합니다.

7. Swift Testing 프레임워크

import Testing

@Test
func testAddition() {
  #expect(1 + 1 == 2)
}

@Test(arguments: [1, 2, 3])
func testIsPositive(_ value: Int) {
  #expect(value > 0)
}

Swift 6부터 Swift Testing 패키지가 포함되어 import Testing 만으로 바로 사용 가능합니다.

8. 임베디드 스위프트 (Embedded Swift) 미리보기

@freestanding(expression)
macro printEmbeddedMessage() = #externalMacro(module: "EmbeddedMacros", type: "HelloMacro")

func main() {
  #embedded printEmbeddedMessage()
}

임베디드 환경용 런타임이 없는 코드 생성 모드로, 펌웨어나 IoT 기기 개발용으로 사용됩니다.

9. Swift Package Manager 개선

// Package.swift
swiftLanguageVersions: [.v6],
swiftSettings: [
  .enableExperimentalFeature("StrictConcurrency")
]

매크로 패키지 배포 지원, 종속성 해석 속도 향상, Swift 플러그인 내 매크로 자동 탐지 기능이 추가되었습니다.

10. 정리 및 마이그레이션 팁

항목 Swift 5 Swift 6 변경점
동시성 안전 옵션 (경고) 기본 강제 (오류)
throws 모두 Error Typed throws 지원
매크로 실험적 정식 도입
비복사 타입 없음 ~Copyable 도입
테스트 XCTest Testing 프레임워크
SPM 단순 매크로/플러그인 통합

Swift 6는 언어의 안정성과 생산성 모두 완성 단계에 도달했습니다.

Swift 5.x 코드는 대체로 빌드되지만, Sendable 및 actor 격리 문제를 정리해야 합니다.

새 프로젝트라면 Swift 6 언어 모드 + 엄격 동시성을 기본값으로 설정하는 것을 권장합니다.

 

반응형
Posted by 까칠코더
,