-
API 변경
첫 번째 파라미터의 이름
Swift2에서 첫 번째 파라미터 이름은 생략하는 것이 일반적이었습니다. 하지만 Swift3에서는 첫 번째 파라미터의 이름도 표기합니다. [SE-0046]
기존에는 메소드명에 표기되던 'in', 'of', 'to' 등의 전치사가 메소드의 이름에서 사라지고 파라미터의 이름으로 사용됩니다. 이를 통해 가독성이 좋아졌습니다.
첫 번재 파라미터가 필요없다고 판단되면 언더바(_)를 통해서 생략시킬 수 있습니다.
불필요한 단어 삭제
기존의 애플 라이브러리에는 메소드의 리턴타입, 파라미터 등이 메소드 이름에 표기되어 있었습니다.(stringByAppendingString처럼)
컴파일러가 알아서 타입체킹을 해주기 때문에 이런 작업은 무의미한데요. 그래서 Swift3에서는 이런 무의미한 단어들이 제거되었습니다. [SE-0005]
GCD와 Core Graphics
GCD와 Core Graphics가 새롭게 태어났습니다.
GCD는 무거운 작업이나 서버통신과 같은 작업을 별도 스레드로 분리하기 위해 많이 사용합니다. 기존에는 C언어로 구현된 GCD관련 함수를 사용했는데요.
Native Swift로 새롭게 태어났습니다. [SE-0088]
C언어로 쓰여진 Core Graphics도 아래처럼 변경됩니다. [SE-0044]
Enum타입의 case(대소문자) 변경
Enum타입의 값이 기존에는 UpperCamel표기법을 사용했으나, Swift3에서는 lowerCamel표기법을 사용합니다. 이를 통해 Enum타입의 형태가 일반 변수와 같아졌습니다.[SE-0006]
이제 UpperCamel표기법은 Type명과 Protocol에만 사용됩니다.
Method. Return하느냐 Modify하느냐
Standard 라이브러리의 메소드명에도 변화가 있습니다. 개발자들은 사용할 메소드를 선택할 때, 메소드 명에서 많은 힌트를 얻습니다.
"-ed", "-ing"와 같은 접미사가 붙은 메소드명은 '명사'로 인식하게 됩니다. 이런 '명사' 메소드는 값을 리턴하는 메소드입니다.
접미사가 없는 메소드명은 '동사'메소드 입니다. 이러한 '동사'메소드는 메모리상에 특정한 작업을 수행합니다. (이를 modifying in place라고도 하네요..)
Standard 라이브러리에는 '명사', '동사' 짝을 이루는 메소드가 꽤 있습니다.
enumerate()
/enumerated()
,reverse()
/reversed()
,sort()
/sorted()
가 있습니다. 이 메소드들의 실제 사용은 아래와 같습니다. [SE-0006]Function Types
함수를 선언하거나 호출할 때 파라미터를 항상 감싸는 괄호가 존재합니다.
하지만 함수를 다른 함수의 파라미터로 사용할 때는 이렇게 사용했죠.
코드를 읽으려고 하니 꽤나 읽기 힘듭니다. 어디까지가 파라미터이고 어디가 리턴타입인거죠?? Swift3에서는 위 함수를 이렇게 정의합니다. [SE-0066]
파라미터는 괄호에 감싸져있고, 그 뒤에 리턴타입이 오게 됩니다.
Swift3코드가 좀 더 알아보기 쉽죠?
( Int -> Int 타입의 클로져를 받아서 똑같은 타입의 클로져를 반환하는 함수네요. 사실 제가볼땐 둘 다 개떡같음.. 그래도 Swift3코드가 1만큼 더 알아보기 쉽네요.)
API 추가
위에서 보았듯 Swift3에서는 이미 존재하던 API들에 많은 변화가 있었습니다. 그게 전부가 아니라 새로운 API도 추가되었습니다!
Accessing the Containing Type
static 프로퍼티나 메소드를 호출하려면 그에 해당하는 타입을 사용해야 했습니다.
CustomStruct.staticMethod()
static을 선언하고 있는 타입 내에서도 해당 static 프로퍼티/메소드를 사용하기 위해서 타입명을 앞에 붙여줘야 했습니다. 이를 개선하고자 Self라는 키워드가 탄생했습니다.
S가 대문자인데요. self와 다르게 사용됩니다.
Self는 자신의 타입을 의미하고, self는 그 타입의 인스턴스를 의미하는데 사용됩니다. 아래 예제를 참고하세요. [SE-0068]
위 사항은 Swift3.1 이후 추가될 예정입니다. XCode8에서 아직 사용할 수 없습니다.
Inline Sequences
sequence(first:next:)
와sequence(state:next:)
라는 global 메소드가 생겼습니다. 이 메소드는 클로져에 해당하는 sequence를 무한으로 리턴하는 메소드인데요. 예제를 통해 살펴보는게 빠르겠네요. [SE-0094]prefix를 사용하여 sequence에 제약사항을 걸 수 있습니다. [SE-0045]
위 사항은 Swift3.1 이후 추가될 예정입니다. XCode8에서 아직 사용할 수 없습니다.
기타
- #keyPath()가 등장하여 #selctor()처럼 사용할 수 있습니다. REST API의 result를 핸들링하기가 편해질 것 같습니다.
- 파이(pi)을 타입에 따라 다르게 사용할 수 있습니다. Float.pi, CGFloat.pi처럼요. 그리고 컴파일러는 이 때 사용되는 pi의 타입을 추론할 수 있습니다. 아래의 예제에서도 타입추론을 문제없이 해냅니다. [SE-0067]
let circumference = 2 * .pi * radius
- NS라는 접두사가 사라집니다. 이제 NSDate, NSCalendar등과 같은 타입이 Date, Calendar로 바뀌게 됩니다.
언어/API에 대한 내용을 적어보았습니다.
그 외 개발환경 및 성능에 관한 내용이 출처에 더 있습니다.
'앱등이에게 살충제를 뿌린다. > Swift' 카테고리의 다른 글
[Swift3의 Access Control] - open Class가 뭐야? (0) 2017.01.11 [Swift] Swift로 유닛테스트를 하려면? How to Unit-test in Swift? (0) 2017.01.09 [Swift] static 함수와 class 함수! static func vs class func (7) 2016.07.20 [Swift] String의 subString을 subscript로 구현해보자. (0) 2016.05.01 [Swift] Objective-C 오픈소스(AFNetworking 2.0)를 Swift에 적용시켜보자 (0) 2016.03.21