2014년 9월 4일 목요일

Swift - Xcode 6 Beta 7 변경점

늘상 한국시간 기준 화요일에 릴리즈 되길래 이번주는 넘어가나보다 했지만 그 다음날에 베타7이 나와버렸다. 이번에는 변화가 좀 있길래 스위프트(Swift) 언어 위주로 변경된 점을 정리해본다.

개인적으로 영어 해석 능력이 좀 딸리는지라 이상한 내용이 있을지도 모르겠다. 이런건 댓글로 욕해도 감사히 먹겠다. :-)

 개인적인 체감 변화

CF류 자료구조 및 함수 혹은 UnsafeBitCast 처리에 뭔가 변화가 생겼나보나. Beta 6에서 잘 돌아가던 코드들이 몽땅 Unknown Error를 내뱉기 시작했다. 짜증난다. 살려줘~~~!! 에러 내용이라도 보여줘!
그런데 리부팅하니 해결되었다. 뭐지?!
대신 일부 심볼이 링크에러나던 오류가 고쳐졌다. 예를 들자면 NSVariableStatusItemLength 라던가...

프레임워크 친화(?)

Foundation, UIKit, CoreData, SceneKit, SpriteKit, Metal 등등 다수의 프레임워크에 있는 API들이 좀 더 스위프트 친화적이게 되었다: Implicit Unwrapped Optionals 로 선언된 다수의 파라미터나 리턴타입 선언이 기본 옵셔널로 변경되거나 혹은 옵셔널이 아니게 되었다.

이로 인해서 기존 코드들이 잔뜩 에러나는 경우가 발생 할 수도 있다. (기억하자. 스위프트는 한창 개발중인 언어다)

문자열과 문자의 연결은 안된다

편의를 위해 아래와 같은 코드를 사용해왔다면 이제는 안된다는 말이다.
// Error Case
let str = "A B " + Character("C")
이제는 문자열 끼리만 연결(Concat)이 지원된다.
let str = "A B " + String("C")    // "A B C"
물론 하고 싶다면 할 수도 있다. '+' 오퍼레이터를 오버로드하면 된다.
func + (left: String, right: Character) -> String {
    return left + String(right)
}

let str: String = "A B " + Character("C")     // "A B C"
참고로 문자(Character) 끼리의 연결은 계속 된다.
let cc = Character("A") + Character("C")     // "AC"
이건 그냥 놔둬두 문제는 없을 것 같은데... 뭔가 모르는 이유가 있나보다.

버그 수정

sort()가 stack overflow를 일으키는 버그가 수정되었다. 세상에 이런 버그가 있었다니...

Unmanaged 타입들을 사용 시 종종 컴파일 오류를 일으키는 버그가 수정되었다. 하지만 그 덕분에 내 코드들이 에러가 나나보다. 젠장.

제너릭(generic) 타입이 자기 자신의 타입을 프로퍼티로 가질 때 오브젝트화(메모리 할당) 과정에서 런타임 크래쉬가 발생하는 문제가 수정되었다. 아래는 실제 릴리즈 노트에 있는 예제 코드이다.
class BinaryTree<T> {
    init(value: T) { self.value = value }
    var value: T
    var left: BinaryTree<T>?
    var right: BinaryTree<T>?
}

기타 스위프트의 변화는 아니지만, 플레이그라운드나 REPL과 관련된 오류나 빌드 시 EMBEDDED_CONTENT_CONTAINS_SWIFT 플래그에 관한 것들이 있다.

버그들

이번에도 대놓고 '나 버그 많음' 이라고 릴리즈 노트에 써 놨다. 너무 많아서 몇 가지 눈에 띄는 것만 꼽아봤다.
  • 인스턴스화 된 enum 타입과 enum의 value를 '==' 오퍼레이터로 비교하는게 안된다. 쓰고 싶다면 당분간 '!'과 '!='을 조합해 NOT NOT-EQUAL 으로 비교하라고 한다. 뭐 이런 =_=;;;
  • Nested Function이 자기 자신을 재귀적(Recursive)으로 호출하도록 코딩하면 죽는다. 어떻게 보면 당연할 수도 있는데...
  • XIB나 스토리보드에서 NSValueTransformer 로 바인딩 해 놓으면 엉뚱한 레퍼런스가 연결된다고 한다. 당분간은 그냥 쓰지 않는 편이 좋다.
  • Objective-C 클래스가 Swift subclass를 가지고 있다면 리팩토링이 안된다는데, 두 언어를 한 번에 쓰는 것이 아니라 Objective-C 쪽 클래스의 프로퍼티 타입이 Swift로 구현된 코드를 의미하는 것 같다.
  • 사전형(Dictionary)에 Int64나 UInt64 같은 64비트 타입을 사용하면 32비트 플랫폼에서 값이 이상해지는 버그가 있다는데, 아마도 유니버셜 바이너리의 경우를 의미하는 것 같다. 일단 이 경우에는 NSNumber를 쓰라고 한다.
  • 기타 Xcode에 존내 버그 많음 이라고 쓰여있다. 물론 베타니깐 당연하겠지...

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

댓글 없음 :