[swift2] New in Swift2.0

Swift 2015. 6. 19. 23:02


올 가을 Swift2.0 정식버전이 발표된다고 합니다. Xcode7 beta Release Notes를 통해 그 변경사항을 잠시 알아볼까요?
원문: Xcode7 beta Release Notes


Swift Language Features

1. 에러처리

에러를 throw, catch 그리고 관리하는 함수를 생성할 수 있습니다. file-not-found 에러 혹은 네트워크 타임아웃
같은 회복가능한 에러를 처리하고, 의도를 명확하게 드러낼 수 있습니다. Swift 에러 처리는 NSError와 상호동작합니다.

2.가용성 체크

선택된 deployement target 보다 더 신버전의 운영체제에서 지원하는 API를 호출하면
Swift는 컴파일 타임에 에러를 보고합니다. 런타임에 영속적으로 사용 불가능한 API를 검사하려면,
if 또는 guard 문에서 새롭게 추가된 available()조건을 사용하세요.

if #available(iOS 8.0, OSX 10.10, *) {
    // Use Handoff APIs when available.
    let activity = NSUserActivity(activityType:"com.example.ShoppingList.view")
     activity.becomeCurrent()
} else {
    // Fall back when Handoff APIs not available.
} 

3. @available() 속성

함수 선언부에 @available() 속성을 사용하여 가용성 정보를 명시할 수 있습니다.

// iOS 8.0 이상, OSX 10.10 이상, 다른 플랫폼의 모든 버전에서 사용가능합니다.
@available(iOS 8.0, OSX 10.10, *)
func startUserActivity() -> NSUserActivity {
    ...
}

4. 프로토콜 Extensions

프로토콜 타입을 위한 Extensions을 작성할 수 있습니다. 특정 프로토콜를 따르는 어떠한 타입에도 메서드와 속성을 추가
할 수 있게되어 더 많은 코드를 재사용 할수 있습니다. 유연한 인터페이스 원칙에 따라 호출 측의 dot 메서드 문법을 더 자연스럽게 하고,
제네릭 코드 정의를 더 단순하게 합니다.

5. 프로토콜 디폴트 구현

프로토콜은 프로토콜 extension 명세에 따른 기본 구현체를 가질 수 있습니다. mixin, trait 같은 패턴구현이 가능해집니다.

func xyz() throws {

6. defer 구문

defer 구문은 scope를 빠져나올때 클린업 코드를 실행합니다. 특히 새 에러처리 모델과 결합하여 사용하면 유용합니다.

let f = fopen("x.txt", "r")
defer { fclose(f) } 
try foo(f)      // 에러가 발생하면 f가 닫힘

let f2 = fopen("y.txt", "r") 
defer { fclose(f2) }
try bar(f, f2)   // 에러가 발생하면 f2가 닫히고, f가 닫힘
} 
// 정상흐름에선 f2가 닫히고, 그다음 f가 닫힘

7. guard 구문

scope를 조기에 빠져나갈 수 있게합니다.
(의도하지 않는 조건에선 조기에 scope를 빠져나가게 하여, 다음 코드를 신경쓰지 않도록 해준다는 내용입니다.)

guard let z = bar() else { return }
use(z)

scope를 빠져나가기 위해 else 블럭이 필요합니다. (예를 들면 return,throw,break,continue와 함께)

8. 패턴매칭 향상

switch/case 패턴매칭이 if/case, while/case, guard/case, 그리고 for-in/case를 포함하여
많은 새로운 조건 제어구문에서 사용가능합니다. for/in 문은 where 절을 가질수 있습니다.

9. do 구문

do 구문을 사용하여 새로운 scope를 정의할수 있습니다.

do {
    //new scope
 do {
     //another scope
 }
}

10. 테스트성 향상

Swift2.0 프레임워크와 앱들의 테스트(코드)들은 내부 루틴을 public 으로 만들지 않고 작성되었습니다.
테스트 소스코드에서 모든 것을 public으로 만들어 내부 루틴을 사용할 수 있게 만들어주는 다음 구문을 사용하세요.

@testable import { ModuleName }  

앱과 프레임워크 타겟은 "Enable Testability" 빌드설정을 활성화하고 컴파일 해야합니다.
Enable Testability 설정은 앱과 프레임워크의 모든 내부 심볼들까지 exporting 할지 결정하여 최적화를 막을 수 있기때문에
Debug configuration 에서만 사용되야 합니다.

11. C 함수포인터 Native 지원

함수포인터를 인자로 갖는 C함수는 clusers 또는 글로벌 함수를 사용하여 호출할 수 있습니다.

// 표준C qsort
var array = [3, 14, 15, 9, 2, 6, 5]
qsort(&array, array.count, sizeofValue(array[0])) { a, b in
    return Int32(UnsafePointer<Int>(a).memory - UnsafePointer<Int>(b).memory)
}
print(array)

12. 진단기능 향상

var 대신 let 사용을 권장하기 위한 새로운 warning과 unused variables warning이 추가되었습니다. invalid mutation warning 진다는 보다 더 정밀해졌으며, unreachable switch cases 절도 warning을
발생시킵니다.

13.enum 다중 제네릭 연관값을 지원

enum Either<T, U> {
    case Left(T), Right(U)
}

13. enum 프린팅 구문 - enum case와 playload 출력 (가능한 경우에만)

@objc enum과 다중 payload를 갖는 enum 에는 적용되지 않습니다.

14. 제네릭 타입의 public extension 허용

    public extension Array { … }

15. 제네릭 클래스로부터 non 제네릭 클래스 상속이 가능

16. swift 문자열 접합연산 - 컴파일 타임에 최적화를 보장

17. 실패 가능한 Convenience 생성자에서 self.init 호출전에 nil 리턴 허용

여전히 Designated 생성자들은 nil을 리턴하기 전에 모든 저장속성들을 초기화 해야합니다.

18. 중첩함수는 재귀적으로 자기자신과 다른 중첩함수들을 참조 가능

19. if 문에 라벨링 가능

라벨이 있는 break 문은 매칭되는 if문 밖으로 jump 하는데 사용됩니다.
라벨이 없는 break 문은 if문을 종료시키지 못하지만, 루프문과 스위치 구문은 종료시킵니다.

20. x? 패턴

.Some(x) 와 동일한 의미로 optional에 붙어 x? 패턴을 사용할수 있습니다.

21. 인스턴스 멤버에 @objc 키워드가 붙는 것을 방지해주는 @nonobjc 속성 추가

(Swift 코드를 Objective-C에 노출시킬 때, @nonobjc 속성이 붙은 속성과 메소드는 노출되지 않습니다.)

22. 표준 라이브러리에 readLine() 추가





'Swift' 카테고리의 다른 글

[swift] 문자열 Indexing과 Slicing  (0) 2015.06.23
[swift] Map, Filter, Reduce  (0) 2015.06.22
[swift2] New in Swift2.0  (0) 2015.06.19
[swift] Apple Swift Blog  (0) 2015.06.10
[swift] Swift 기초 - 4  (0) 2014.10.29
[swift] Swift 기초 - 3  (1) 2014.10.29

[swift] Apple Swift Blog

Swift 2015. 6. 10. 01:00


애플 WWDC 2015 에서 Swift2 공개와 올해 말 오픈소스화 발표가 있었습니다.

애플 swift 블로그를 방문하니 역시나 새롭게 단장되어있네요.   Swift2 의 변화를 훑어보기 위해 대문 페이지를 번역해보았습니다. 

[출처]: Apple Swift blog




Swift.  안전하고, 빠르며, 인터렉티브한 

최신의 프로그래밍 언어


Swift는 iOS, OS X, watchOS를 위한 강력하고 직관적인 프로그래밍 언어입니다. 

Swift 코드를 작성하는 것은 인터렉티브하고, 재미있습니다. 문법은 간결하지만 표현력이 풍부하며,  

앱은 번개처럼 빠르게 실행됩니다.  Swift는 당신의 다음 프로젝트 - 또는 현재 앱에도 사용할수 있도록 

준비되어있습니다. - 왜냐하면  Swift는 Objective-C 와 함께 동작하기 때문이지요.




Swift 2 소개

Swift 는 밑바닥부터 개선되었습니다. 릴리즈, 디버그 빌드를 막론하고 더 빠른  코드를 생성합니다.

Swift 컴파일러는 var 대신 let를 사용하라는 새로운 Fix-it 제안을 제공해주는데도 더 빠릅니다.

주석에 마크다운를 사용하여 rich text와 내장 이미지를 추가할 수 있습니다.

새로운 assistant는 header-like 뷰에서 Swift API를 보여줍니다.  그리고 Cocoa 프레임워크와 Objective-C 

코드를 더 풍부하고 훨씬 안정성있게 해주는 새로운 문법들이 개선되었습니다. 




에러처리 모델(Error Handling Model)

진보된 에러처리 모델은 에러를 캐치하고 던지는 명확하고, 풍부한 문법을 제공합니다. 

쉽게 커스텀 에러타입을 정의하고 명확하고 의미있는 이름으로 에러 케이스를 기술할  수 있습니다. 

새로운 에러모델은  NSError 클래스와 Cocoa 프레임워크와 잘 조화되도록 설계되었습니다.


에러 처리 코드의 예입니다.


개선된 문법(Syntax improvements)

새로운 문법 특징들은 언어를 일관성 있게 개선하면서도 더 풍부한 코드를 

작성할 수 있게 합니다. SDK는 Objective-C에, Swift를 더 명확하고 안전하게 하는 

 generics와 nullability 어노테이션을 도입했습니다. 

Swift 2.0에 개선된 몇가지 예입니다. 

- do, guard, defer, repeat를 사용한 강력한 제어흐름 

- 함수와 메서드  키워드 네이밍 규칙 통합

- 프로토콜 extension 과 디폴트 구현 

- if문과 for 루프에서의 확장된 패턴매칭 

Xcode7는 애플리케이션과 playground 코드를 최신 Swift2.0 의 개선된 문법으로 

변환해주는 강력한 마이그레이터를 포함합니다.


가용성(Availability)

최신의 특징, 문서, API 변경사항을 접근하기 위해서 최신의 SDK 사용해야 했지만

때때로 앱이 이전 버전의 OS 에서 실행되야할 때가 있습니다.

Swift2.0 가용성 체킹 기능을 가지고 있습니다. 기능은 target OS version  

가장 적합한 앱을 쉽게 빌드할 있게 해줍니다. 컴파일러는  최소 OS 타겟에서는 지원하지 않는

새로운 api 사용하려 할때 에러를 발생시킵니다

그리고 특정 버전의 OS에서만 실행되도록 버전분기를 해주는 코드블럭를 

랩핑하는 키워드들 제공합니다.


오픈소스(Open Source)

올해 Swift 오픈소스로 릴리즈 됩니다

우아하고, 강력하고 안전한 Swift 결정체가 산업 전반에 소개될 수 있는

기회를 제공합니다. 우리가 함께 개발하는 것을 상상하니 흥미진진합니다. 


모던(Modern)

Swift 수십년의 애플 플랫폼 개발 경험과 가장 최신의 프로그래밍 언어 연구결과의 집합체입니다.

Objective-C에서 차용한 named 파라미터는 명확한 문법으로 표현하되, 가독성과 유지보수를 쉽게합니다.

타입추론은 모듈이 헤더를 제거하고 네임스페이스를 제공하면서, 코드를 더 깔끔하게 하고, 그리고 실수를 덜 

유발하게 합니다. 메모리는 자동으로 관리되며, 세미콜론 조차 타이핑 할 필요 없습니다.

모든 이런 현대적인 아이디어들이 언어를 쉽고, 사용하기 재미있게 만들어줍니다. 



Swift는 코드를 더 풍부하게 하는 다른 많은 특징들을 가지고 있습니다. 

- 클로저는 함수 포인터와 통합되었습니다.

- 튜플과 다중 리턴값 

- 제네릭

- 빠르고 간결한 range와 collection iteration

- 메서드, extension, 프로토콜을 지원하는 구조체

- map, filter와 같은 함수형 프로그래밍 패턴

- try/catch/throw 를 사용하는 네이티브 에러처리 



 

   인터렉티브 플레이그라운드 (Interactive Playgrounds)

Playgrounds 는 Swift 코드 작성을 믿을수 없을 정도로 단순하고 재미있게 합니다. 

한 줄의 코드 타이핑 결과가 즉시 나타납니다. 코드 오른편에서 빠르게 결과를 훑어보거나, 

그 결과를 바로 아래에 고정할수 있습니다. 결과뷰는 그래픽, 결과리스트, 시간의 흐름에 따른 그래프로 

볼수 있습니다. Time Assistant를 열어 관련된 뷰들이 변화하고 애니메이션 되는것을 볼수 있습니다. 

새로운 UI코드를 실험하고, 코딩하면서 애니메이션 되는 SpriteKit Scene을 실행해보기 좋습니다. 

Playground에서 코드작성을 완료했을 때, 단순히 프로젝트로 코드를 옮기세요. 

Xcode7의 새로운 기능중 하나로  Playgrounds는 이탤릭 볼드, 불릿 리스트, 내장이미지와 링크 등을 가진 

rich text를 사용하여 주석을 달수 있습니다.  심지어 리소스도 내장할수 있어서 코드는 단순하게 하면서도 

Swift 소스 코드를 믿을수 없을 정도로 강력하고 매력적이게 할수 있습니다.


아름다운 텍스트와 인터렉티브한 코드를 사용하여 프로그래밍 커리큘럼을 공유할 수 있습니다.

새로운 알고리즘을 설계하고, 단계마다 그 결과를 볼수 있습니다.

테스트 슈트를 만들기 전에 새로운 테스트를 작성하고 동작하는지 검증할 수 있습니다.

Swift 코딩 기술을 연마하기 위해 새로운 API를 실험해볼 수 있습니다.

실험결과를 Playgrounds 안에서 동작하는 코드예제를 갖는 문서로 만들 수 있습니다.


Read-Eval-Print-Loop(REPL)

Xcode의 LLDB 디버깅 컨솔은 Swift 언어의 인터렉티브한 버전을 포함하고 있습니다.

스위프트 문법을, 실행되고 있는 앱과 상호작용하고 evaluate하는데 사용해보세요.

또 스크립트 같은 환경에서는 어떻게 동작하는지 새로운 코드를 작성해보세요.

Xcode 컨솔과 터미널에서 사용가능합니다.


안정성을 위한 설계(Designed for Safety)

Swift는  불안전한 코드들을 제거했습니다. 변수는 사용하기 전에 초기화 되어야 하고, 

배열과 정수타입은 오버플로그 검사를 하며 메모리는 자동으로 관리됩니다. 

문법은 의도를 잘 드러내도록 튜닝되었습니다.

예를 들어 단순하게 3문자 키워드를 사용하여 변수(var) , 상수(let)를 선언합니다. 

또 다른 사례로, 디폴트로 Swift 객체는 nil이 될 수 없습니다. 

Swift 컴파일러는  컴파일 타임 에러로 객체가 nil이 되는 것을 예방합니다. 

이것이 코드작성을 훨씬 명확하게 하고, 안전하게 합니다. 그리고 당신 앱의 수많은 종류의 

런타임 크래시들을 예방해줍니다. 그러나 nil이 유효하고 적절한 값일 경우가 있습니다. 

이런 상황에서는 optional이라고 알려진 혁신적인 특징을 사용합니다.

optional은 nil을 포함할 수 있으며, Swift 문법은 당신이 이해할 수 있고, 안전하게 처리할수 있도록

 ?구문을 사용하도록 강제합니다. 


빠르고 강력하다(Fast and Powerful)

초기 컨셉부터 Swift는 속도를 염두해두고 개발되었습니다. 고성능 LLVM 컴파일러를 사용하여, Swift 코드는 

대부분의 최신 하드웨어에 최적화된 네이티브 코드로 변환됩니다. 문법과 표준라이브러리는 코드가 가장 잘 실행되도록

튜닝되었습니다.

Swift는 C와 Objective-C 언어들을 계승합니다.  로우레벨 기본형 타입들과, 제어흐름, 연산자들을 포함하고 있습니다.

클래스, 프로토콜, 제네릭과 같은 객체지향 특징들은 Cocoa, Cocoa Touch 개발자들이 필요로 하는 성능과 힘을 제공합니다.


Objective-C 상호운영성 (Interoperability) 

Swift를 사용하여 전체 애플리케이션을 작성할 수 있습니다.

현재 앱의 새로운 기능 구현을 위해서 Swift코드를 사용할 수도 있습니다.

Swift 코드는 동일 프로젝트에 있는 Objective-C 파일들과  함께 존재하며, 전체 Objective-C API 에 접근하며 쉽게 적용할

수 있습니다.







'Swift' 카테고리의 다른 글

[swift] Map, Filter, Reduce  (0) 2015.06.22
[swift2] New in Swift2.0  (0) 2015.06.19
[swift] Apple Swift Blog  (0) 2015.06.10
[swift] Swift 기초 - 4  (0) 2014.10.29
[swift] Swift 기초 - 3  (1) 2014.10.29
[swift] Swift 기초 - 2  (0) 2014.10.29