What’s New in Swift 4

JSON Encoder and Decoder

Swift에서 JSON을 사용할 때는 주로 SwiftyJSON이나 JSONSerialization을 사용합니다. Swift 4에서는 새로 도입된 JSONEncoder와 JSONDecoder를 사용할 수 있습니다.

struct RequestData: Codable {
    let data: String
}

let data = RequestData(data: "Lorem Ipsum")

do {
    let encoded = try JSONEncoder().encode(data)
    let decoded = try JSONDecoder().decode(RequestData.self, from: encoded)
    decoded.data
}

Type Safe Key path Literals

키패스는 그동안 문자열 또는 #keypath 표현식을 통해서 표현했습니다. Swift 4에서는 새로운 문법을 통해 키패스 리터럴을 표현할 수 있습니다. 키패스 리터럴은 \ 문자로 시작하고 이어서 공백없이 형식 이름과 속성이름이 따라옵니다.

\Type.property

예를 들어 UILabel의 backgroundColor 속성에 대한 키패스는 다음과 같이 표현할 수 있습니다.

let keypath = \UILabel.backgroundColor

Source Compatibility Modes

Xcode 9은 소스 호환성 모드를 통해 Swift 3.2 코드와 4.0 코드를 함께 지원합니다. 타깃 설정을 통해 각 타깃의 Swift 버전을 개별적으로 설정할 수 있기 때문에 이전에 작성된 3.2 버전의 코드를 유지하면서 필요한 부분에만 4.0 코드를 도입할 수 있고, 마이그레이션 과정에서 빈번히 발생하던 소스 버전 호환성 문제도 해결되었습니다.

 

Multi-line String literals

“”” 과 “”” 을 통해 여러줄의 문자열의 하나의 문자열로 표현할 수 있게 되었습니다.

문자열 리터럴은 반드시 “”” 다음 줄에서 시작하고 “”” 이전 줄에서 끝나야 합니다. 즉, 시작하는 “”” 뒤와 끝나는 “”” 앞에는 어떤 문자도 포함될 수 없습니다.

let str = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"""

One-Sided Ranges

범위 연산자에서 lower bound와 upper bound 중 하나만 지정할 수 있게 되었습니다.

7...

예를 들어 이 코드처럼 lower bound만 지정하면 7부터 시작되는 무한대의 범위를 지정할 수 있습니다. 편리하지만 무한 루프가 발생하지 않도록 주의해서 사용해야 합니다.

One-Sided Ranges는 서브스크립트 문법에서 유용하게 사용됩니다. 생략된 bound는 위치에 따라 startIndex 또는 endIndex가 자동으로 사용됩니다.

let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[...5])
// equals numbers.startIndex...5

 

Subscript with default value

딕셔너리의 값을 읽을 때 키에 해당되는 값이 없을 경우 기본값을 지정할 수 있는 문법이 추가되었습니다.

var vegetableCounts = ["spinach": 7]

for veg in ["tomato", "cauliflower"] {
    vegetableCounts[veg, default: 0] += 1
}

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

*