[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