Language/Swift

새로워진 Swift 6 (WWDC24: What's new in Swift)

jaewpark 2024. 6. 19. 00:58

10년 간의 Swift 변천사

|600

  • 2014년: Swift의 시작
  • 2015년: 오픈 소스로 전환, Linux에서도 사용 가능
  • 2016년: Swift 3, SPMSwift Package Manager 도입
  • 2017년: Swift 4, 최신 버전으로 마이그레이션하지 않아도 되는 기능이 추가
  • 2018년: Generics의 개선과 조건부 적합성Conditional Conformances[각주:1] 도입
// 조건부 적합성
extension Array: Comparable where Element: Comparable {
  static func < (lhs: Array<Element>, rhs: Array<Element>) -> Bool {
      // 비교 로직
  }
}
  • 2019년: SwiftUI, ABIApplication Binary Interface[각주:2] 도입
  • 2020년: Windows 포트가 swift.org 제공
  • 2021년: Swift Concurrency 도입
    비동기/대기(Async/Await), 액터(Actors), 구조적 동시성(structured concurrency) 등
  • 2022년: Distributed actors[각주:3] 도입
  • 2023년: C++와 상호 운용이 강화, Macros 도입

 

Swift.org

Swift Package Index를 통해서 package 선택에 편리
또는 Swift 커뮤니티에서 논의되는 흥미로운 패키지를 추천하는 Community Showcase

Swift project를 위한 새로운 GitHub

 

everywhere

 

Foundation

|500

  1. 일관성 및 성능 향상: Foundation의 구현이 일관성이 더 높아지고, 품질이 향상되었으며, 성능도 개선
    이는 JSON 디코딩, 날짜 및 시간 포맷팅, 파일 처리 등과 같은 다양한 API에서 바로 경험 가능
  2. 모든 플랫폼에 동시 출시: 새로운 기능과 개선 사항이 모든 지원되는 플랫폼에 동시에 제공
    이는 개발자들이 어떤 플랫폼을 사용하든 최신의 Foundation 기능을 사용 가능
  3. 오픈 소스화: Swift Foundation은 오픈 소스로 제공
    새로운 API를 추가하기 위한 오픈 에볼루션 프로세스도 운영
  4. Objective-C와의 상호운용성: 심지어 Objective-C로 작성된 애플리케이션도 이러한 개선 사항의 혜택
    스위프트와의 호환성을 극대화하여 더 나은 성능과 기능을 제공

 

Swift Testing

Macros와 같은 최신 Swift 기능을 활용하여 동시성과 원활하게 통합
크로스 플랫폼을 염두에 두고 오픈 소스로 개발

import Testing

// 테스트를 선언하기 위해 Test 특성 추가
// 지정된 표시 이름을 제공
// tags를 사용하여 필터링
// 여러 입력의 중복되는 것을 방지하기 위해 인수를 사용 가능
@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를 사용하여 결과가 충족되는지 확인
    @expect(video.rating == expectedRating)
}

자세한 내용은 WWDC24: Meet Swfit Testing

 

Builds

  1. 모듈 병렬 빌드: 스위프트 6부터는 모듈 빌드가 병렬로 수행 가능
    이는 빌드 로그에 명확히 나타나며, 더 예측 가능하고 신뢰할 수 있는 빌드를 제공
  2. 디버깅 속도 향상: 디버거가 빌드와 바이너리 모듈을 공유할 수 있어, 디버깅 속도가 단축
  3. 명시적 모듈 빌드: 명시적 모듈 빌드는 Xcode 빌드 설정에서 활성화
    이는 빌드 프로세스의 명확성을 높이고, 모듈 의존성을 더 잘 관리 가능
  4. 크로스 컴파일: macOS에서 리눅스 서버로 크로스 컴파일할 수 있는 기능도 강조
    예를 들어, macOS에서 리눅스용으로 스위프트 패키지를 빌드하고, 해당 바이너리를 리눅스 서버에 배포 가능
  5. 정적 링크 SDK 사용: 스위프트에서 정적 링크 Linux SDK를 사용하여, 추가 패키지를 설치하지 않고도 모든 리눅스 머신에서 실행할 수 있는 정적 링크 바이너리를 생성 가능

 

Language update

 

Noncopyable type

기본 복사 가능성을 억제합니다.
고유한 소유권을 표현하려는 시나리오에 적합합니다.

예를 들어, 파일과 같은 고유한 시스템 리소스는 deinit을 사용하여 ~Copyable로 표시가 가능합니다.
동일한 파일에 대한 런타임 문제 혹은 리소스 누수를 방지합니다.
파일을 open할 때 파일 이름이 유효할 때에만 생성할 수 있는 실패 가능한 init으로 deinit 해제되지 않는 상황에 대한 문제를 해결할 수 있습니다.

이전까지는 구체적인 유형으로만 제한이 되었지만,
Swift 6에서는 Noncopyable type을 지원합니다.

  • all generic contexts
  • Optional, Result, Unsafe Pointers와 같은 표준 라이브러리

자세한 내용은 WWDC24: Consume noncopyable types in Swift

 

Embedded Swift

Embedded Swift는 자원이 제한된 시스템에서 스위프트를 실행할 수 있도록 최적화된 새로운 언어 하위 집합입니다.
Noncopyable type을 지원하여 메모리 및 성능 효율성을 극대화할 수 있습니다.

Apple 장치에서 데이터를 보호하기 위해 사용되는 Secure Enclave Process에서도 Embedded Swift를 사용합니다.
C와 C++와의 상호 운용성을 갖추고 있어 점진적으로 Swift를 채택할 수 있습니다.

 

C++

안전 보장이 부족하여 보안 공격에 노출되어 있던 C++ 프로젝트
Swift를 점진적으로 도입하여 보안과 생산성을 향상시킬 수 있습니다.

// C++
struct Person {
    Person(const Person&) = delete;
    Person(Person &&) = default;
};
// Swift
struct Developer: ~Copyable {
    let person: Person
    init(person: consuming Person) {
        self.person = person
    }
}

let person = Person()
let developer = Developer(person: person)
person.printInfo() // 의도치 않게 "~Copyable" 값을 복사하려고 하면 컴파일러가 진단

 

throws

유형 삭제가 되기에 Error의 구체적인 정보를 잃기 때문에 동적 유형 검사를 삽입해야 했었습니다.

do {
    let value = try parse(string: "1+234")
} catch let error as IntegerParseError {
    // ...
}

유형 삭제에는 boxing 및 unboxing도 포합됩니다.
런타임 할당 기능이 없는 고도로 제한된 시스템에서는 문제가 됩니다.

Swift 6에서는 Typed Throw를 도입
입력된 throws 키워드와 함께 오류 유형을 지정할 수 있습니다.

func parse(string: String) throws(IntegerParseError) -> Int {
    for index in string.indices {
        // ...
        throw IntegerParseError.nonDigitCharacter(string, index: index)
    }
}

자세한 내용은 swift-evolution: 0413-typed-throw

 

data-race safety

|600


점진적으로 데이터 경합 안정성을 달성했습니다.
Swift 6에서는 Data-Race Safety가 기본적으로 적용됩니다.

병렬적으로 실행될 수 있는 유사 스레드 Actor는 내부 상태를 보호하고 메시지 교환을 통해 안전하게 동작할 수 있도록 합니다.
Complete Concurrency Checking 기능으로 런타임 중 데이터 경쟁이 발생할 가능성이 있는 부분을 미리 감지하고 에러를 방지합니다.

  1. 특정 타입이 특정 조건을 만족할 때만 프로토콜을 준수하도록 하는 기능 [본문으로]
  2. 컴파일된 프로그램과 운영 체제, 또는 다른 프로그램 간에 상호작용하는 방식을 정의하는 표준 [본문으로]
  3. 네트워크를 통해 분산 시스템에서 안전하고 효율적으로 상태를 관리하고 메시지를 교환 가능, 위프트의 동시성 모델을 확장하여, 분산 환경에서도 스위프트의 안전성과 간결함을 유지 가능 [본문으로]