2015년 8월 25일 화요일

Swift 2.0 - 그 외 사소한(?) 변화들

사람에 따라 사소하지 않은 변화일 수도 있지만, Swift 가 버전 1.2에서 2.0 으로 올라가는 사이에 바뀐 것들 일부를 정리해 본다. (개인적으로 큰 변화라고 느끼는 부분은 별도의 글로 정리하였으니 글 목록을 찾아보자. -_-;)

print

println이 print로 통합되었다. 이제는 print함수가 '\n'을 포함하여 콘솔에 내용을 표시한다. (즉 콘솔에 문자열 한 줄을 찍을 때 사용한다 -_-). 굳이 예제는 필요하진 않을 것이다. :-)

Array

배열에서 여러 변화들이 보인다.

Array.enumerate()

enumerate() 메소드를 이용해 인덱스와 내용을 이터레이션(열거) 할 수 있게 되었다. 참고로 2.0 이전에는 메소드가 아니라 enumerate() 함수를 사용해야 했었다.
let names = [ "cheolsoo", "younghee", "minkook", "gildong" ]
for (index, name) in names.enumerate() {
    print("#\(index). \(name)")
}

Array.contains()

이름만 봐도 알겠지만, 내용물이 있는지 파악하기 위한 메소드이다.
names.contains("yungsuk")
names.contains("younghee")

Array.indexOf

contains()와 비슷하지만 이 메소드는 이름 그대로 인덱스(순서 번호)를 가져오기 위한 메소드이다.
names.indexOf("minkook")

String.characters

문자열 쪽에는 characters 라는 프로퍼티가 추가되었다. 이름처럼 [Character] 와 비슷한 식으로 쓸 수 있는 프로퍼티이다.
let exampleString = "test"

// Swift 1.2
count(exampleString)    // 4

// Swift 2.0
exampleString.characters.count    // 4
문자열의 길이를 구할 때 기존의 count를 이용하는 방식에 상당한 이질감을 느꼈었는데 마음에 드는 변화이다.

do - while 대신 repeat - while

do 문이 예외처리 쪽으로 편입되는 바람에 repeat라는 키워드가 추가되었다. repeat는 기존의 do가 하는 역활을 대체한다.
// Swift 1.2
do {
    ...
} while condition
// Swift 2.0
repeat {
    ...
} while condition

OS 버전 확인(Availability)

Objective-C의 경우 NSObject에 정의된 responseToSelector 등을 활용해 메소드 존재 여부 파악이 가능했다. Swift의 경우도 NSObject를 상속받으면 responseToSelector를 여전히 쓸 수 있을 것 같긴 하지만 이는 Pure Swift가 아니니 생략한다.

어쨌든 그래서 Swift에는 OS의 버전별 변화에 따라 바뀌는 메소드 들에 대응 할 수가 없었는데 이제 그 방법이 생겼다.

일단 OS의 버전을 체크하는 문법을 제공한다.
if #available(iOS 8.0, *) {
    // iOS 8.0 이상 버전용 대응코드
}
else if #available(iOS 9.0, OSX 10.10, watchOS 2.0, *) {
    // iOS 9.0, OS X 10.10, watch OS 2.0 대응코드
}
별표(*)는 구분자로 쓰이는 모양인데 일단 필수적으로 넣어야 한다고 한다. 이런 식으로 #available 을 이용해 런타임으로 OS 버전 구분이 가능하다. 두 번째 예제에서 볼 수 있듯이 다른 OS들도 한번에 확인하는 것이 가능하다.

이것과 다른 방식으로 메소드나 함수 등에 available 제한을 걸어줄 수도 있다.
@available(iOS 8.0, *)
func eightOSFunc() {
    ...
}
이제 이 함수는 특정 iOS 8.0 버전 이상에서만 부르는 것이 가능해진다.

기타 프레임워크 변화들

이전의 예외처리 부분에서 살펴봤듯이 NSErrorPointer 를 인자로 받던 많은 프레임워크 메소드나 함수들이 이제 do - try - catch 문법에 맞게 throws 를 하도록 바뀌었다. 예제 코드는 생략한다. 

일부 Enum 타입들이 OptionSetType 형식의 구조체로 대체되었다. 대표적으로 NSCalendarUnit 이 있다. 기존의 경우 아래와 같은 식으로 썼었다면
let flags: NSCalendarUnit = .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay
Swift 2.0(Xcode 7) 부터는 아래와 같은 식으로 써야 한다.
let flags: NSCalendarUnit = [ .Year, .Month, .Day ]
더 좋은건지 안좋은건지 모르겠다. C에 익숙한 개발자로써는 익숙한 문법을 버렸다는 사실에 내심 아쉽다는 느낌이긴 하다.

이 외에 이터레이션 조건식 혹은 필터링과 관련된 부분들이 좀 더 추가된 것 같은데 필요하다면 별도로 정리하겠지만 아직까진 활용도를 잘 모르겠다.

[관련글] Swift - print 와 debugPrint 이야기​
[관련글] Swift 2.0 - OptionSetType
[관련글] Swift 2.0 - 예외처리(Error Handling Model)
[관련글] 스위프트(Swift) 가이드

댓글 1개 :

jusung :

좋은 정보 공유 감사합니다.!
항상 잘 보고 있습니다.