[WWDC-2021] What's new in Swift (1)

2021. 6. 30. 18:08iOS/WWDC

이 글은 WWDC-2021 영상을 정리하여 작성한 글입니다.

원본 영상은 링크를 참고하여 주세요.

Swift Package Collections

Xcode 13과 Command line 에서 사용할 수 있는 Swift Package의 큐레이션 목록인 Swift Package Collections 를 먼저 소개드립니다.

Package Collections는 더이상 인터넷에서 package들을 찾지 않아도 되고, 그것들을 추가하기 위해 URL을 복사 붙혀놓기 하지 않아도 될 것입니다. 단지 아래와 같이 Xcode 상에서 간단하게 package들을 찾고 추가할 수 있습니다.

Swift Collections

Swift Collections 는 기존의 Swift Standard Library에서 제공하는 데이터 구조를 보완하는 새로운 오픈소스 패키지 입니다.

Swift Collections의 초기버전에서 제공되는 데이터 구조에는 총 세가지가 있습니다.

  • Deque
  • OrderedSet
  • OrderedDictionary

Swift Collections는 'Collections'를 import 하여야 합니다. 

Deque(덱)

// Deque

import Collections

var colors: Deque = ["red", "yellow", "blue"]

colors.prepend("green")
colors.append("orange")
// `colors` is now ["green", "red", "yellow", "blue", "orange"]

colors.popFirst() // "green"
colors.popLast() // "orange"
// `colors` is back to ["red", "yellow", "blue"]

Deque은 Array와 비슷해 보이지만, 양 쪽 끝에서 삽입과 제거를 지원한다는 점이 다릅니다.

prepend() 를 통해 전방삽입이 가능해 졌으며, Array에 있는 메소드와 똑같이 append 를 통해 후방삽입이 가능합니다. 또한, popFirst를 통해 첫번째 아이템을 제거할 수도 있습니다. 

OrderedSet

import Collections

var buildingMaterials: OrderedSet = ["straw", "sticks", "bricks"]

for i in buildingMaterials {
	print("Little piggie #\(i) built a house of \(buildingMaterials[i])")
}

// Little piggie #0 built a house of straw)
// Little piggie #1 built a house of sticks)
// Little piggie #2 built a house of bricks)

buildingMaterials.append("straw") // (inserted: false, index: 0)

OrderedSet은 기존의 존재했던 Array와 Set의 강력한 하이브리드(?) 입니다. OrderedSet은 Array와 마찬가지로 순서를 유지하며 랜덤 엑세스를 지원합니다. 또한, Set과 마찬가지로 각 요소가 한 번만 나타나도록 하며 효율적인 membership testing 을 제공합니다.

 

OrderedDictionary

import Collections

var responses: OrderedDictionary = [200: "OK", 403: "Forbidden", 404: "Not Found"]

for (code, phrase) in responses {
	print("\(code) (\(phrase))")
}

// 200 (OK)
// 403 (Forbidden)
// 404 (Not Found)

OrderedDictionary는 순서가 지켜지지 않던 Dictionary와 달리, 순서가 중요하거나 요소에 대한 랜덤 엑세스가 필요할 때 강력한 기능을 발휘할 수 있습니다.

Swift Algorithms

Swift Algorithms는 Sequence 및 Collection 알고리즘의 새로운 오픈소스 패키지 입니다.

위 사진과 같이 40개 이상의 알고리즘 들이 추가되어 Collection의 요소에 대해 모든 조합 또는 순열을 생성하거나, 예측 변수(?)에 의해 결정된 두세 개 또는 그룹으로 시퀀스 요소를 반복하거나, Collection 에서 가장 작은 요소 다섯 개, 가장 큰 요소 다섯 개 또는 임의의 요소를 무작위로 선택할 수 있습니다.

자세한 내용은 Meet the Swift Algorithms and Collections packages를 확인 할 수 있습니다.

Swift System

지난 가을, Swift에서는 시스템 호출에 관용적이고 낮은 수준의 인터페이스를 제공하는 라이브러리인 Swift System을 open source로 공개하였습니다. System은 Apple 플랫폼, Linux 및 Windows에서도 사용할 수 있습니다. 

import System

let fd: FileDescriptor = try .open(
	"/tmp/a.txt", .writeOnly,
    options: [.create, .truncate], permissions: .ownerReadWrite)
try fd.closeAfter {
	try fd.writeAll("Hello, WWDC!\n", .utf8)
}

최근에는 공통 경로 조작 작업을 수행하기 위해 시스템의 FilePath 유형에 강력한 새 API를 추가했습니다.

import System

var path: FilePath = "/tmp/WWDC2021.txt"
print(path.lastComponent)			// "WWDC2021.txt"

print(path.extension)				// "txt"
path.extension = "pdf"				// path == "/tmp/WWDC2021.pdf"
path.extension = nil				// path == "/tmp/WWDC2021
print(path.extension)				// nil

path.push("../foo/bar/./")			// path == "/tmp/wwdc2021/../foo/bar/."
path.lexicallyNormalize()			// path == "/tmp/foo/bar"
print(path.ends(with: "foo/bar"))	// true!

이 API는 extension을 쿼리, 또는 설정하고 구성요소를 추가 및 제거하며 경로 정규화를 수행하는 기능이 포함됩니다. 그리고 경로는 그것의 루트 및 상대구성요소로 분해할 수 있습니다.

FilePath의 ComponentView는 정형 경로 구성 요소의 모음으로, 많은 Swift의 일반 알고리즘을 즉시 지원합니다.

또한 Windows를 대상으로 할 때 윈도우즈의 복잡한 루트 구성 요소도 새로운 모든 FilePath API에 완벽하게 지원됩니다.

The Numerics package

Swift Numerics는 작년에 Float16 타입을 iOS, tvOS, and watchOS 가져왔고, 올해 Apple Silicon Macs에 추가 하여 Float16 기반의 복잡한 수를 만들 수 있게 되었습니다. 또한 log, sine, cosine 등의 기본 함수에서 이러한 Complex number가 지원됩니다.

import Numerics

let z = Complex(0, Float16.pi)	// nil
let w = Complex.exp(z)			// exp(pi) -1

DocC

 

DocC, Document Compiler 는 개발자에게 Swift 프레임워크나 패키지를 어떻게 사용하는지 가르쳐 주기 위해  Xcode 13에 통합된 문서 컴파일러 입니다.

DocC는 Swift 소스 코드에 있는 마크다운 설명과 같이 사용자가 이미 알고 있고 좋아하는 툴과 기술을 사용하여 처음부터 구축되므로 문서를 쉽게 작성하고 쉽게 배포할 수 있습니다.

그리고 이는 오픈소스로 공개되어 Swift가 지원하는 모든 플랫폼에서 보다 쉽게  문서를 작성할 수 있습니다.관련 영상 또한 다양하게 참고하실 수 있습니다. https://developer.apple.com/wwdc21/10166

,https://developer.apple.com/wwdc21/10167,https://developer.apple.com/wwdc21/10235

Type Checker

Swift 5.5에서는 Type Checker에서 품질 및 성능 향상에 투자하였습니다. 따라서, 코드를 컴파일 할 때 너무 복잡한 표현식 같은 경우 에도 오류를 적게 표시합니다.

 

Build Improvements

 

또한 이번 릴리즈에서는 증분 빌드 속도를 높이기 위해 3가지 주요 개선 사항을 통해 개발자 생산성을 높힐 수 있습니다.

이제 incremental imports를 지원합니다. 즉, 모듈이 변경될 때 모듈을 가져오는 모든 소스 파일을 더 이상 재구성하지 않습니다.또한 이제 모듈 종속성 그래프를 미리 계산하여 변경된 항목만 증분 빌드할 수 있습니다.마지막으로 선택적 재컴파일을 확장하여 확장 기능을 사용할 수 있으므로 확장 본문을 변경할 때 재컴파일을 줄일 수 있습니다

Memory Management

Swift 에서는 ARC라는 시스템을 통해 특정 개체에 대한 참조 수를 추적합니다.

이번 릴리즈에서는 컴파일러가 retain 및 release 작업의 수를 크게 줄일 수 있도록 컴파일러 내부의 참조를 추적하는 새로운 방법을 도입했습니다. 이러한 ARC 최적화가 코드에 미치는 영향을 확인할 수 있도록 Xcode 설정인 Optimize Object Life를 추가했습니다.