Swifter {Swift Developer}

메뉴

 

Swift 3.0의 변경사항

Sticky

Swift 3.0이 이제 2016년 가을 Xcode 8이 정식출시되면 사용이 많아질 것으로 예상되는데 그전에 Swift 2.x와 어떤 부분이 달라지는지 Swift Evolution의 Implemented proposals for Swift 3에 나온 새로운 기능과 변경사항 제안 내용이 정리되어 있는 것을 정리해본다. 단, Accepted proposals which do not have a complete implementation목록에 있는 것은 제외한다. 아래 내용은 2016년 5월말까지의 자료를 기준으로 작성했다.

  • SE-0002 : Removing currying func declaration syntax (커리 함수 선언 구문 삭제)
  • SE-0003 : Removing var from Function Parameters (함수의 매개변수에서 var 삭제)
  • SE-0004 : Remove the ++ and — operators (++/– 연산자 삭제)
  • SE-0005 : Better Translation of Objective-C APIs Into Swift (Objective-C API를 Swift에 최적화)
  • SE-0006 : Apply API Guidelines to the Standard Library (표준 라이브러리로 API의 지침 적용)
  • SE-0007 : Remove C-style for-loops with conditions and incrementersx (C-Style의 for문 제거)
  • SE-0008 : Add a Lazy flatMap for Sequences of Optionals (선택적 배열을 위한 Lazy flatMap 추가)
  • SE-0016 : Adding initializers to Int and UInt to convert from UnsafePointer and UnsafeMutablePointer (UnsafePointer과 UnsafeMutablePointer에서 변환하는 Int uint로 초기화 추가)
  • SE-0019 : Swift Testing (Swift 테스트)
  • SE-0023 : API Design Guidelines (API의 설계 지침)
  • SE-0029 : Remove implicit tuple splat behavior from function applications (암시적 튜플 스플랫 함수 삭제)
  • SE-0031 : Adjusting inout Declarations for Type Decoration (형 장식을 위한 inout 선언 조정)
  • SE-0033 : Import Objective-C Constants as Swift Types (Objective-C의 상수를 Swift형으로 가져오기)
  • SE-0037 : Clarify interaction between comments & operators (코멘트 / 오퍼레이터 표기규칙 명확)
  • SE-0039 : Modernizing Playground Literals (현대적인 Playground 리터럴)
  • SE-0040 : Replacing Equal Signs with Colons For Attribute Arguments (속성에서 =가 아닌 :을 사용)
  • SE-0043 : Declare variables in ‘case’labels with multiple patterns (여러가지 패턴의 “case”레이블 변수)
  • SE-0044 : Import as Member (Member 가져오기)
  • SE-0046 : Establish consistent label behavior across all parameters including first labels (첫번째 레이블을 포함한 모든 매개변수에서 일관된 레이블 실행 확립)
  • SE-0049 : Move @noescape and @autoclosure to be type attributes (@noescape에서 @autoclosure으로 이동)
  • SE-0053 : Remove explicit use of let from Function Parameters Function 매개 변수에서 let의 명시적인 사용을 제거
  • SE-0054 : Abolish ImplicitlyUnwrappedOptional type (ImplicitlyUnwrappedOptional형 폐지)
  • SE-0055 : Make unsafe pointer nullability explicit using Optional (안전하지 않은 포인터 NULL 값을 허용할지 여부를 Optional사용을 명시적으로)
  • SE-0057 : Importing Objective-C Lightweight Generics (Objective-C 경량화된 제네릭 가져오기)
  • SE-0059 : Update API Naming Guidelines and Rewrite Set APIs Accordingly (API 네이밍 지침과 Set API의 업데이트)
  • SE-0061 : Add Generic Result and Error Handling to autoreleasepool() (Generic Result와 autoreleasepool() 오류 처리 추가)
  • SE-0064 : Referencing the Objective-C selector of property getters and setters (Objective-C selector의 getter / setter 참조)
  • SE-0065 : A New Model For Collections and Indices (컬렉션과 인덱스의 새로운 모델)
  • SE-0069 : Mutability and Foundation Value Types (Mutability와 Foundation의 Value Types)
  • SE-0070 : Make Optional Requirements Objective-C-only (Objective-C 전용 Optional 요구 사항 생성)
  • SE-0071 : Allow (most) keywords in member references ((대부분의) 멤버 참고 키워드 허용)
  • SE-0072 : Fully eliminate implicit bridging conversions from Swift (Swift에서 완전히 암시적 브릿지 변환 제거)

SE-0002 커리함수 선언 구문 삭제

func foo(x: Int)(y: Int) 효과는 제한적 구현이 복잡해지기 때문에 제거해야 한다.

SE-0003 함수의 매개변수에서 var 삭제

함수의 매개변수는 기본적으로 변경할 수 없습니다.

var가 많이 있는 경우 함수의 매개변수로 inout과 혼동됩니다. 따라서 함수 매개변수에 var가 삭제되었습니다.

SE-0004 ++/– 연산자 삭제

위 ++/– 연산자가 삭제되었습니다.

SE-0005 Objective-C API를 Swift에 최적화

Swift언의 API설계지침에 따라 형, 메소드, 속성등의 이름이 최족화되었습니다.

  1. swift_name속성 적용을 일반화
  2. 중복명을 생략
  3. 기본 인수를 추가
  4. 첫번째 인수 레이블 추가
  5. Boolean 속성 시작은 is를 붙임
  6. Lowercase values
  7. compare(_:) -> NSComparisonResult

UIBezierPath API in Swift2

UIBezierPath API in Swift3

SE-0006 표준 라이브러리로 API지침 적용

전체 표준 라이브러리를 검토하고 가이드라인을 준수하기 위해 업데이트합니다.

제안내용

  • 프로토콜명에서 형 접미사를 제거함
  • generator 개념은 모든 API로 추상화됨
  • Bit는 삭제되었기 때문에 Int를 사용함
  • 안전하지 않는 포인터에서 No-argument initializers는 삭제되었고 대신 nil을 사용함
  • PermutationGenerator를 삭제함
  • MutableSliceable을 삭제하였고 대신 MutableCollection사용함
  • sort() => sorted(), sortInPlace() => sort()
  • reverse() => reversed()
  • enumerate() => enumerated()
  • partition() API가 단순화
  • SequenceType.munElement() => .min() .maxElement() => .max()
  • 배열과 컬렉션의 아답터를 위한 몇가지 초기화가 삭제되었고 대신 해당 알고리즘의 함수나 메소드를 호출함
  • 어떤 함수 속성을 반대함
  • String factory methods에서  nul-terminated UTF-8 date(C문자열) 초기화됨

SE-0007 C-style for문 제거

Swift 3.0은 –와 ++가 제거됨에 따라 C-Style반복문은 없어졌습니다. 새로운 for문은 Swift 2.2부터 구현되어 있습니다.

SE-0008 선택적 배열을 위한 .Lazy flatMap추가

현재 Swift의 표준라이브러리에서는 두가지 flatMap이 있습니다.

.lazy사용할 경우 실행할때 다르기 때문에 변경합니다.

SE-0016 UnsafePointer와 UnsafeMutablePointer에서 변환하는 Int uint로 초기화 추가

int, uint에서 안전하지 않는 [Mutable]포인터를 작성하는 것과 똑같이 [Mutable]포인터도 int, uint를 만들어 줄 수 있습니다. 이는 intptr_t, uintptr_t 매개변수에서 C함수를 호출할 수 있고 UnsafePointers에 의해 허용된 것보다 고급 포인터 연산을 할 수 있습니다.

SE-0019 Swift 테스트

Package manager에 테스트가 통합되는 ?하여 안정상과 신뢰성을 높힙니다.

SE-0023 API설계지침

전체 표준 라이브러리를 검토하고 가이드라인을 준수하기 위해 그것을 업데이트합니다. (관련 SE-0006)

SE-0029 암시적 튜플 스플릿 동작 삭제

다음 함수가 있다고 가정해 봅시다.

일반적인 호출방법의 예는 아래와 같습니다.

많이 알려지지 않았지만 아래와 같은 튜플형의 단일값으로 인수를 전달합니다.

이 실행방법은 삭제되는 것 같습니다. 참고로 다음과 같은 함수값으로 튜플을 전달하는 기능은 삭제되지 않았습니다.

SE-0031 형 장식을 위한 inout선언 조절

inout을 설명하는 위치가 변경되었습니다.

SE-0033 Objective-C 상수를 Swift형으로 가져오기

Objective-C API의 정수부분이 enum이나 struct로 정의된다고 봅니다.

SE-0037 코멘트와 오퍼레이터 표기 규칙을 명확하게

현재 코멘트인지 구분하는 것이 모순이 있습니다.

SE-0039 현대적인 Playground에서 리터럴

Playground리터럴을 재설계하는 것으로 보여집니다.

SE-0040 속성에서 =이 아닌 :로 사용

이전

변경

SE-0043 여러가지 패턴의 case레이블 변수

아래와 같이 여러가지 패턴이 포함되는 경우 오류가 발생하는데 이런 오류가 발생하지 않도록 변경합니다.

SE-0044 Member 가져오기

C라이브러리 프레임웍을 가져올 수 있지만 Swift같지 않아 최적화한 것으로 보여집니다.

SE-0046 첫번째 레이블을 포함한 모든 매개변수에서 일관된 레이블 실행 확립

현재 첫번째 매개변수 선언을 두번째 이후 매개변수와 같은 실행되는 것을 수정한 것 같습니다.

위와 같은 경우 foo(_:,y:)으로 되어 있지만 foo(x:y:)으로 될 것 같습니다. 기존처럼 foo(_:,y:)처럼 하고 싶은 경우 명시적인 레이블을 붙이는 것 같습니다.

SE-0049 @noescape에서 @autoclosure로 이동

@noescape와 @autoclosure를 추가하는 위치가 변경되는 것입니다.

SE-0053 function매개변수에서 let명시적 사용 제거

함수 매개변수에 다음과 같이 명시적으로 let을 붙이면 컴파일 오류로 인식되는 것 같습니다.

SE-0054 ImplicitlyUnwrappedOptional 형 폐지

ImplicitlyUnwrappedOptional형이 제거되고 IUO속성 선언으로 대체되는 것 같습니다. 또한 [Int!]나 (Int!, Int!)과 같은 사용할 수 없습니다.

SE-0055 안전하지 않는 포인터 NULL값을 허용할지 여부를 Optional을 사용하여 명시적으로

포인터에 NULL값을 허용하려면 ?을 명시적으로 지정할 수 있도록 하는 것입니다. 이에 따라 일부 API가 변경될 것 같습니다.

SE-0057 Objective-C 경량화된 제네릭 가져오기

cocoa와 Cocoa Touch는 정적인 형의 안전성과 표현력을 향상시키기 위해 Objective-C의 경량화된 제네릭을 채용하고 있는 다수의 API가 포함되어 있습니다. 그러나 이런 매개변수는 Swift에 가져올 경우 매개변수가 손실됩니다. 예로 현재 NSArray <NSSting *> *은 [String]대신 [AnyObject]로 브릿지됩니다. 즉 Swift는 이런 Objective-C API를 가져오는 것이 개선된 것 같습니다.

SE-0059 API지침 Set API업데이트

SetAlgebra, Set, OptionSet에 대해 API지침에 입각한 수정이 이루어지는 것 같습니다.

SE-0061 Generic Result와 autoreleasepool() 오류처리 추가

현재 표준 라이브러리의 autoreleasepool기능은 리턴값 또는 오류처리를 지원하지 않습니다. 일반적인 리턴값의 형을 가능하게 하는 표준 라이브러리 autoreleasepool 함수명을 변경하는 것뿐만 아니라 오류 발생을 가능하게 될 것 같습니다. 표준 라이브러리는 다음과 같이 변경됩니다.

SE-0064 Objective-C selector의 getter/setter참조

SE-0022는 Objective-C의 메소드 셀렉터를 참조 #selector가 구현되어 있지만 속성의 getter/setter를 볼 수 없기 때문에 참조할 수 있도록 해야 합니다.

SE-0065 컬렉션과 인덱스의 새로운 모델

index작업 변경등 컬렉션 주의가 수정되는 것 같습니다.

SE-0069 Mutability와 Foundation의 Value Types

(Value Type) = (Class Type)

  • AffineTransform = NSAffineTransform
  • CharacterSet = NSCharacterSet, NSMutableCharacterSet
  • Date = NSDate
  • DateComponents = NSDateComponents
  • Data = NSData, NSMutableData
  • IndexSet = NSIndexSet, NSMutableIndexSet
  • IndexPath = NSIndexPath
  • Notification = NSNotification
  • PersonNameComponents = NSPersonNameComponents
  • URL = NSURL
  • URLComponents = NSURLComponents
  • URLQueryItem = NSURLQueryItem
  • UUID = NSUUID

SE-0070 Objective-C전용 Optional 요구사항 만듬

Objective-C 프로토콜 optional의 경우 @objc을 명시적으로 지정하도록 변경된 것 같습니다.

SE-0071 (대부분) 멤버 참고 키워드 허용

멤버 액세스에 키워드 사용을 허용한 것으로 보여집니다. 단 언어적으로 특별한 의미가 있는 self, dynamicType, Type, Protocol.은 제외합니다.

SE-0072 Swift에서 완전히 암시적인 브릿지 변환 제거

Swift3.0에서 암시적 브릿지 변환이 완전히 삭제되는 것 같습니다.

Facebook Comments

카테고리:   Swift

댓글

죄송하지만 댓글은 닫혀 있습니다.