눈에 띄는 Swift 4 변경점들 (Xcode 9 첫 Beta 기준)

최근에는 좀 게으르게(?) 지내고 있다가 WWDC가 온줄도 모르고 Xcode 9 의 베타가 나오는 줄도 모르고 허송세월 보내고 있었다. 잠깐 정신을 차리고 Swift 4 에 관련된 내용을 간단히 정리해 볼까 한다.

Swift 4 에서 생기는 변화는 문법적인 변화 보다는 기능의 추가에 중점이 맞춰진 것 같다. 그래서 아마도 대비하기에는 이전 보다는 편할 것 같다.
이 글은 Xcode 9 첫 베타 버전 기준으로 쓰여졌다.

Codable

이건 아래 상세한 글을 참고하자.

[관련글] Swift 4 - Codable / JSONDecoder / JSONEncoder

프로토콜이 명시된 타입

Objective-C 에서는 특수한 프로토콜을 따르는 인스턴스를 지정하는 방법이 있다. 예를 들어 아래와 같은 프로퍼티를 보자.
@property (strong) id<SomeProtocol> delegate;
이렇게 하면 SomeProtocol 을 따르는 인스턴스만 delegate 에 대입 할 수 있다.

이와 비슷한 것을 Swift 에도 도입하려는 것이 이것인 것 같다. 아래와 같이 '&' 문자를 이용해 프로토콜을 함께 명시할 수 있다.
var viewController: UIViewController & UITableViewDataSource
위와 같은 viewController 프로퍼티가 있다면 이 프로퍼티에는 반드시 UIViewController 의 인스턴스 이면서 동시에 UITableViewDataSource 를 따르는 인스턴스만을 대입 할 수 있게 된다.

'&' 문자는 AND 연산자를 떠올리게 하는데, 타입 선언에서만 사용되니 헷갈리지는 않을 것 같다.

사전형과 집합

다양한 편의 기능이 추가되었다. 이 중 몇 가지만 꼽아보자.

대표적으로 리스트로 사전형을 생성할 수 있게 되었다.
let dict = [String : Int](uniqueKeysWithValues: [("a", 111), ("b", 222)])
// ["a": 111, "b": 222]
위 예제는 키와 값 순서로 선언한 튜플 배열을 이용해 사전형 데이터를 생성한다.

그리고 사전형에 기본값이라는 개념이 생겼다. 기존의 사전형의 경우 엉뚱한 키로 엑세스 하면 nil을 리턴했지만 Swift 4 부터는 아래와 같이 기본값을 설정할 수 있다.
dict["c", default: -1]
// -1
참고로 위 예제는 이 앞의 예제가 실행된 것을 가정하고 있다.

그 외에 사전형(Dictionary)과 집합형(Set)에서 사용되는 filter 나 map 이 이제 배열이 아니라 원래의 타입 형태로 리턴되게 바뀌었다.

기타 많은 기능이 추가되었으니 매뉴얼을 확인하자.

키패스(Key Path) 표기

새로운 키패스 표기법이 추가되었다.
\Type.propertyName
예를 들어 이런 식이다.
struct MyType {
  let name: String
  let value: Int
}

let a = MyType(name: "a", value: 100)
a[keyPath: \MyType.name]  // "a"
a[keyPath: \MyType.value]  // 100

let keyPath = \MyType.name
type(of: keyPath)
백슬래시가 좀 마음에 안들긴 하지만 문법 자체는 나쁘진 않다. 참고로 플레이그라운드에서 마지막의 type(of:) 결과과 좀 복잡하게 표시되지만 String 타입이라고 알 수 있다.

단방향 범위(Range)

원래 범위 표기는 시작과 끝이 있어야 했다. 예를 들어 1부터 100 까지는 1...100 로 표기했다.

그런데 최소나 최대 범위를 표현하기 위해 새로운 문법이 추가되었다. 예를 들어
1...
은 1 부터 끝(?) 까지라는 범위 표현이다. 반대로
...100
은 처음부터 100 까지라는 범위 표현이다.

루프에 이런 식을 써버리면 아마도 난감하겠지만, 범위에서 시작이나 끝 지점을 표현할 때는 유용할 것 같다.

문자열(String)

역시 몇 가지만 뽑아보겠다.

멀티라인 문자열 표기

"""
First line.
Second line.
"""
마치 Python 에서 본 듯한 문법인데 정말 비슷하다. 이 문자열은 실제로 아래와 같이 만들어진다.
"First Line.\nSecond Line."
시작과 끝 부분을 표시하는 따옴표 3개의 위치를 잘 보자.

참고로 멀티라인 문자열 표기법이라 아래와 같이 쓰면 에러가 난다.
let str = """This is single line string"""
좀 스트릭트 하지만 이게 장점이기도 하니... :-)

부분문자열(Substring)

let string = "this is test"
let index = string.index(of: " ")!  // 4
let firstWord = string[..<index]  // "this"
type(of: firstWord) // Substring.Type
서브스크립트 슬라이스(Subscript Slice)를 통해 생성된 firstWord 의 타입은 Substring 이라는 타입이다. 의미를 보면 알겠지만 원래 문자열의 부분 문자열이라는 의미다.

문자의 갯수(count)

"abc".count == "abc".characters.count
// true
즉, 문자 갯수를 알기 위해 이제 문자열 인스턴스의 .characters.count 대신 다시 .count 프로퍼티를 쓸 수 있다. 왜 그런지 모르겠지만 어쨌든 짧게 쓸 수도 있으니 좋은건가?

마무리

앞서 Xcode 9 의 첫 베타 버전 기준으로 시험한 것이기 때문에 나중에 다시 바뀔 여지는 충분히 있다.

내부적으로 뭔가 많이 바뀌고 있는 것 같다. 컬렉션과 관련된 것들도 보이고 프로토콜과 관련된 것들도 보인다. 하지만 왠지 이런 류들의 변화는 크게 쓸 일이 잘 없는 것 같다. (그리고 개인적으로 이해가 잘 안되고 -_-;;;;)

이 외에도 상당수의 변화가 있긴 한데 대부분 기능의 추가와 관련된 부분들이라 특별히 정리할 필요는 없을 것 같다. 예를 들어 Array 의 swapAt 같은 기능은 알면 좋고 없어도 알아서 만들 것 같기도 하고 말이다. :-)

[관련글] Swift 4 - Codable / JSONDecoder / JSONEncoder

[관련글] 스위프트(Swift) 가이드​

댓글

이 블로그의 인기 게시물

버전(Version)을 제대로 이해하기

소수점 제거 함수 삼총사 ceil(), floor(), round()