2015년 12월 4일 금요일

Swift 오픈소스화 소식과 미래의 이야기들

간밤에 애플이 Swift가 오픈소스화 되었다고 공식 발표하였다. 공식사이트는 이제 아래 사이트이다.

https://swift.org

애플은 모든 소스코드 및 커밋 히스토리를 과감하게 github에 몽땅 올렸다. 솔직히 깃헙을 쓰진 않겠지라고 생각해서 좀 놀라긴 했다.

https://github.com/apple/swift

개인적으로 이 저장소를 주시(watching) 하는 중인데 오픈 하루만에 정말 많은 말들이 오가는것 같다. 이미 알려진 GPLv3로 바꾸자는 농담인지 진담인지 알 수 없는 pull-request를 보며 실소를 짓기도 했다. (개인적으로 GPL을 별로 좋아하진 않는다)

이와 함께 다양한 것들이 오픈되었다. Swift 패키지 매니저가 바로 그 중 하나다.

https://github.com/apple/swift-package-manager

내용을 보면 Cocoapods나 Carthage를 대체할 수 있을만한 기능을 제공하는 것 같다. 글만 봐선 Carthage더 가깝게 느껴지는데, 프로젝트들을 어떻게 모듈화 해서 제공하는지는 아직 확인해 보진 못 했다.

Swift Evolution

오픈소스화가 되면서 Swift 3.0에 관한 로드맵도 함께 발표되었다. 받아들여진 것들(Accepted Proposals)에 대해 살펴보자.

Better Translation of Objective-C APIs Into Swift
좀 더 자연스러운 Objective-C API의 매핑

일반 개발자라면 크게 신경 쓸 내용은 아닌 것 같다. 어차피 Swift 2.x 까지도 그랬고 Xcode가 6에서 7까지 올라올때도 그랬지만 계속해서 프레임워크의 Swift 매핑 모양이 바뀌고 있다. 아마도 이런 흐름에 익숙하다면 계속해서 욕하면서 적응하게 될 것이다.

물론 기대되는건 좀 더 쓰기 쉽게 번역될 것이라는 점이다.

Removing cursing func declaration syntax
커링 함수 선언문법의 삭제

개인적으로 커링 함수는 정말 형편없는 가독성의 이상한 기능이었다. 많은 사람들이 비슷하게 느꼈는지 아예 삭제할 예정이다. 커링함수가 사라지는 대신 클로져를 리턴하는 함수를 만들어 쓰면 된다. 지금 커링 함수를 쓰고 있다면 다 바꿔놓자.
// Before:
func curried(x: Int)(y: String) -> Float {
    return Float(x) + Float(y)!
}

// After:
func curried(x: Int) -> (String) -> Float {
    return {(y: String -> Float) in
        return Float(x) + Float(y)!
    }
}

Removing var from Function Parameters and Pattern Matching
함수 파라미터나 패턴매칭 시 var는 쓸 수 없음

선호하는 방식이 있을지도 모르겠지만, 이제 파라미터나 패턴매칭에서 var를 이용해 변경 가능한(mutable) 변수를 선언하는 방법을 막아버리겠다는 의미다.
// EX1
func foo(var i: Int) {
    i += 1 
}

// EX2
if var foo = bar() {
    foo.someMutableOperation()
}
물론 더 많은 것들이 해당되지만 이 정도가 흔히 쓰일 것 같다. 하여간 이런 표현을 3.0 부터는 못 쓰게 된다는 의미다.

하지만 걱정되는 변화는 아니다. var 변수로 받아서 쓰면 되니깐. 거기다 이미 많은 이들이 immutable 스타일의 구현을 선호하고 디자인하고 있다. 익숙해지면 된다.

Remove the ++ and -- operators
++과 -- 오퍼레이터 삭제

Python 등을 알고 있다면, 그리고 ++과 -- 연산자의 우선순위 문제에 대해 알고 있다면 이 변화는 수긍할 것이다. 코드 읽기에서 정확한 순서를 오해할 수 있는 문법을 아예 없애버리고자 하는 점이다.
let nextIndex = index++
이 코드에서 모호함을 느낀다면 그 대상이 된다. nextIndex는 index가 ++로 값이 증가하기 전의 index 값을 받는다. 그리고 그 이후에 ++이 연산되어서 index의 값이 1 증가한다. 하지만 그냥 읽었을 때는 index++ 이 먼저 수행될 것 같이 느낄 수도 있다. 이게 모호함을 만들어 내는 요소다.
index = index + 1
let nextIndex = index
이제 이런 식으로 쓰면 오해 요소는 사라진다. 물론 필요하다면 오퍼레이터를 만들어 쓰면 되니 기존 코드에서 이 오퍼레이터를 굳이 지우지 않아도 되겠지만...

마무리

애플이 약속을 지켰다. 좀 늦긴 했지만 약속대로 2015년 내로 Swift를 오픈소스화 했다.

물론 오픈소스화가 되었다고 오픈소스로 개발된 내용이 그대로 애플의 Swift에 적용되는건 아닐거라고 생각된다. 다른 사기업들도 그랬지만, 기업은 오픈소스로 개발된 것들을 기반으로 자기들만의 패치를 덧붙이거나 일부 커밋만을 적용해서 배포할 것이다.

그렇다고 오픈소스화한게 의미 없는건 아니다. 정말 좋은 변화는 애플도 받아들일 수 밖에 없을테니깐.

어쨌거나 저장소를 wathcing 중인데 메일함이 터질 것 같다. -_-;;;;

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

댓글 없음 :