얼마 전 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

댓글을 달아 주세요

Xamarin사에서 MonoDevelop 오픈 소스 재단을 인수하면서 너무 돈을 밝히는 게 아닌가 싶을 정도로 상업적인 기업으로 변했다. M$(Microsoft)와 긴밀하게 관계가 유지되면서 돈 버는 방법도 너무 M$와 비슷해져 비호감 기업 반열에 충분히 올라갈 것으로 기대한다.

그건 그렇고 필자가 진행하고 있는 MonoDevelop Korean 빌드에 오류가 발생했다. 물론 Xamarin사에 인수되기 전부터 한글화 작업을 진행했던 터라 이번 빌드 문제가 조금 언짢아 진다.


문제 원인: 누락된 Xamarin 라이브러리

./configure —profile=mac 명령행으로 빌드 구성을 한 후에

make 빌드를 수행하면 다음과 같이 이전에 보지 못했던 라이브러리 누락 오류가 발생한다.

$ make  
if test -d ".git"; then \  
        git submodule update --init --recursive || exit 1; \  
    fi  
Making all in external  
make[2]: *** No rule to make target `/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/i386/full/Xamarin.Mac.dll', needed by `Xamarin.Mac.dll'.  Stop.  
make[1]: *** [all-recursive] Error 1  
make: *** [all-recursive] Error 1

해결 방법

먼저 Xamarin Studio 다운로드 페이지에서 최신 버전을 다운로드 받으면, 그 안에서 누락된 라이브러리 파일들을 찾을 수 있다. 누락된 라이브러리 파일은 아래와 같이 3개.

  • Xamarin.Mac.dll
  • Xamarin.Mac.dll.mdb
  • libxammac.dylib

아래와 같이 순서대로 진행하면 된다.

1. Xamarin.Mac.Framework 폴더 생성

$ mkdir -p /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/i386/full

2. 프레임워크 폴더에 복사

Xamarin.Mac.dll과 Xamarin.Mac.dll.mdb 파일을 프레임워크 폴더에 복사한다.

$ find "/Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/Xamarin.Sketches/Xamarin.Interactive.Agents.Mac/" -name 'Xamarin.Mac.dll*' -exec cp -f {} "/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/i386/full/" \;

libxammac.dylib 파일을 프레임워크 폴더에 복사한다.

$ find "/Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/Xamarin.Sketches/Xamarin.Interactive.Agents.Mac/" -name 'libxammac.dylib' -exec cp -f {} "/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/" \;


Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 컴포지트 2015.04.16 09:20 Address Modify/Delete Reply

    저도 자마린이 너무 상업적으로 나가니 상당히 비호감이라고 생각하긴 했습니다.
    그래서 그런지 로슬린이 무척이나 기대할 수 밖에요.