Swift - Xcode 6 Beta 7 변경점
늘상 한국시간 기준 화요일에 릴리즈 되길래 이번주는 넘어가나보다 했지만 그 다음날에 베타7이 나와버렸다. 이번에는 변화가 좀 있길래 스위프트(Swift) 언어 위주로 변경된 점을 정리해본다.
개인적으로 영어 해석 능력이 좀 딸리는지라 이상한 내용이 있을지도 모르겠다. 이런건 댓글로 욕해도 감사히 먹겠다. :-)
개인적인 체감 변화
CF류 자료구조 및 함수 혹은 UnsafeBitCast 처리에 뭔가 변화가 생겼나보나. Beta 6에서 잘 돌아가던 코드들이 몽땅 Unknown Error를 내뱉기 시작했다. 짜증난다. 살려줘~~~!! 에러 내용이라도 보여줘!
프레임워크 친화(?)
Foundation, UIKit, CoreData, SceneKit, SpriteKit, Metal 등등 다수의 프레임워크에 있는 API들이 좀 더 스위프트 친화적이게 되었다: Implicit Unwrapped Optionals 로 선언된 다수의 파라미터나 리턴타입 선언이 기본 옵셔널로 변경되거나 혹은 옵셔널이 아니게 되었다.
이로 인해서 기존 코드들이 잔뜩 에러나는 경우가 발생 할 수도 있다. (기억하자. 스위프트는 한창 개발중인 언어다)
문자열과 문자의 연결은 안된다
편의를 위해 아래와 같은 코드를 사용해왔다면 이제는 안된다는 말이다.
버그 수정
sort()가 stack overflow를 일으키는 버그가 수정되었다. 세상에 이런 버그가 있었다니...
Unmanaged 타입들을 사용 시 종종 컴파일 오류를 일으키는 버그가 수정되었다. 하지만 그 덕분에 내 코드들이 에러가 나나보다. 젠장.
제너릭(generic) 타입이 자기 자신의 타입을 프로퍼티로 가질 때 오브젝트화(메모리 할당) 과정에서 런타임 크래쉬가 발생하는 문제가 수정되었다. 아래는 실제 릴리즈 노트에 있는 예제 코드이다.
기타 스위프트의 변화는 아니지만, 플레이그라운드나 REPL과 관련된 오류나 빌드 시 EMBEDDED_CONTENT_CONTAINS_SWIFT 플래그에 관한 것들이 있다.
버그들
이번에도 대놓고 '나 버그 많음' 이라고 릴리즈 노트에 써 놨다. 너무 많아서 몇 가지 눈에 띄는 것만 꼽아봤다.
[관련글] 스위프트(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) 가이드
댓글