얼마 전 Swift 1.2 버전으로 업그레이드를 실시했다. 뭐, 자의에 의해서 한 것은 아니고, Xcode 6.3.1 버전으로 업데이트 하니 자연스럽게 Swift 언어 버전도 업데이트 된 것!

다음은 Swift 1.2 로 업데이트하면서 나에게 발생한 오류를 정리해 본다.


1. NSStringString 타입 캐스팅(형변환)은 명시적으로 하도록 변경

이렇게 동작하던 코드는 더 이상 암시적으로 캐스팅을 하면 안된다.

func print(string: String) {  
       // print  
}

let str : NSString = “POWERUMC”  
print(str)

Swift 1.2 부터는 위의 코드는 다음과 같이 명시적으로 캐스팅을 해야 한다.

func print(string: String) {  
       // print  
}

let str : NSString = “POWERUMC”  
print(str as String)

2. 다운케스팅은 as! 키워드를 사용하도록 변경

모든 상속 관계의 타입 캐스팅(형변환)은 as 키워드를 사용했지만 이제 다운케이팅의 경우는 as! 를 사용하도록 변경되었다.

request.mutableCopy() 메서드의 반환 타입이 AnyObject인데 이를 NSMutableURLRequestas 키워드로 캐스팅을 하면 되었지만,

var newRequest = request.mutableCopy() as NSMutableURLRequest

Swift 1.2 부터는 아래와 같이 as! 를 사용해서 다운캐스팅을 해야 한다.

var newRequest = request.mutableCopy() as! NSMutableURLRequest

3. init() 를 재정의 하지 말고, super.init() 호출도 하지 않도록 디자인 변경

객체지향 프로그래밍을 하다보면 으레 형식적으로 기본 생성자를 만들기 마련이다. (대체적으로 컴파일러가 알아서 해 주는 경우가 많다)

다음과 같이 더 이상 super.init() 으로 초기화 하면 오류가 발생한다.

override init() {  
    super.init()  
}
Swift 1.2 부터는 super 클래스에서 무조건 초기화가 되도록 변경되어 초기화 코드를 넣지 말아야 한다.
init() {  
    // super.init() <-- 절대 기본 생성자에서 이 코드를 쓰지 말자.  
}
또, Swift 1.2 부터 기본 생성자는 재정의 하지 않도록 한다.
override init() {   // <--- init() 을 재정의 하지 말자.  
}

이전에 init() 생성자에서 초기화 코드를 넣거나 로직을 넣은 경우 골치가 아파진다. 따라서, 이 안에 있던 코드는 다른 곳으로 빼거나 override func init() 선언을 init() 으로 변경하여 재정의나 오버라이드 되지 않게 해야 한다.

4. Optional Type 은 반드시 명시적으로 사용하도록 변경

이전에는 Optional Type 을 사용할 경우 일부분 컴파일러가 알아서 처리(?)를 해 주었기 때문에 ! 또는 ? 을 사용하지 않아도 되었지만, 이런 경우 런타임에 오류가 발생하는 경우가 생길 수 있다.

Swift 1.2 부터는 Optional Type 은 명시적으로 ! 또는 ? 을 사용해야 한다.

class POWERUMC {  
    init?() {  
    }
}

class SomeClass {  
    func makeString() -> POWERUMC {  
        return POWERUMC()!   // <-- ! 또는 ? 를 붙여주자. 다른 방법으로는 반환 타입을 정확히 명시하면 됨.  
    }
}

5. 제거된 일부 프로퍼티

아래의 코드는 일부 사라진 속성을 다른 방법으로 코드를 수정하도록 권장하는 오류가 발생한다. 이 이외에도 친절하게 오류로 설명해 주니 크게 어렵지는 않을 것이다.

// 아래의 코드의 utf16count 속성은 없어졌다. (Deprecated 아님, 제거됨!)  
request.URLString.utf16Count

// Swift 1.2 부터는 아래와 같이 사용하자.  
count(request.URLString.utf16)


Posted by 땡초 POWERUMC

댓글을 달아 주세요

매버릭스 업데이트 후 개발 중인 맥 앱에서 발생하는 문제

OSX 매버릭스로 업데이트한 후 XCode로 개발 중인 유틸리티 프로그램의 일부 기능이 작동하지 않는 현상이 발생한다. 원래 Alpha 버전으로 곧 배포할 예정이었는데, 이 문제로 배포가 늦어질 것 같다.

문제는 Objective-C와 Cocoa를 사용하여 전역 마우스 및 키보드 후킹(hook global mouse and keyboard event)을 사용하는 코드가 있는데, 그 중 키보드 이벤트만 캡춰링(capturing)할 수 없는 현상이 발생한다.

해결 방법

의외로 해결 방법은 간단하다. 먼저 OSX 매버릭스에서 변경된 보안 사항에 대해서 알 필요가 있다. 기술적인 내용은 아니므로 쉬엄쉬엄 다음의 글을 참고하기 바란다.

OS X 10.9 매버릭스(Mavericks)의 바뀐 메뉴 구조 때문에 정상 작동하지 않는 앱 실행하기 (보조 장비에 대한 접근 활성화)

즉, 기본적으로 매버릭스를 설치하면 ‘손쉬운 사용’에 의해 응용 프로그램이 맥이나 기타 장비를 제어하는 것이 차단된다. 필자는 매버릭스로 업데이트 이전에 ‘손쉬운 사용’을 활성화하여 장비에 접근할 수 있도록 설정되어 있었다. 하지만, 업데이트 후에 ‘손쉬운 사용’의 활성화 방법이 변경되면서 이 설정이 초기화 된 것으로 볼 수 있다.

해결 방법은 ‘시스템 환경 설정 -> 보안 및 개인정보’로 들어간 후, ‘손쉬운 사용’ 항목에서 Xcode를 체크해 주면 된다. 그럼 특정 응용 프로그램에서 사용하는 APIs 가 블럭 당하지 않는다.

[그림1] 손쉬운 사용의 Xcode 항목을 체크하면 APIs 가 블럭 당하지 않는다

Posted by 땡초 POWERUMC

댓글을 달아 주세요