swift로 진행하던 프로젝트를 날 잡고 Swift 1.2로 변경했다. 수정한 내용을 정리해본다.
전역 함수 변경

countElement 함수는 count로 바뀌었다.
Objective-C 타입 호환

Swift 1.1 에서는 NSString과 String 타입 사이에 자동으로 타입 변환이 가능(bridging)했었다.
var str1 : NSString = "NSString String Val"
var str2 : String = str1
Swift 1.2 부터는 NSString과 String 사이에 암시적 타입 변환이 지원되지 않는다. 다음과 같이 as를 이용해서 타입 변환 코드를 작성해야 한다.
var str1 : NSString = "NSString String Val"
var str2 : String = str1 as String
배열도 마찬가지다. Swift 1.1 에서 NSArray의 경우 Array와 임시적으로 타입 변환이 가능했다.
var array1 : NSArray = [1, 2, 3, 4]
var array2 : Array = array1
Swift 1.2 에서는 다음과 같이 NSArray에서 Array 객체를 생성한다.
var array1 : NSArray = [1, 2, 3, 4]
var array2 : Array = Array(array1)
프로퍼티와 메소드
다음과 같이 프로퍼티와 메소드를 작성하면 v1.1 과 v1.2 모두 에러가 발생한다.
class Singer {
var name : String = "EXID"
func name() -> String {
return "IU"
}
}
이 코드를 조금 바꿔보자. 상속을 이용해서 프로퍼티와 메소드를 분리하면 v1.1에서 에러가 발생하지 않는다. 다음은 부모 클래스에 프로퍼티를, 자식 클래스에 메소드를 작성했다.
class Person : NSObject {
var name : String!
}
class Singer : Person {
func name() -> String {
return "IU"
}
}
Swift 1.2에서는 다음과 같이 에러가 난다.
셀렉터로 인한 에러이므로 부모 클래스가 NSObject가 아니면 에러가 발생하지 않는다.
타입 변환(down cast)

Swift 1.1까지 타입 캐스팅은 다음과 같았다.
Swift 1.2에 as!가 추가됐다. 이제 다운 캐스팅은 as!를 사용한다.
iOS 개발을 하면서 테이블에서 셀 다룰 때 자주 접하게 된다. 재사용 셀을 찾는 코드에서 셀 타입 변환을 as로 했다면,
tableView.dequeueReusableCellWithIdentifier("CustomCell") as CustomWell
Swift 1.2에서 as!를 사용한다.
tableView.dequeueReusableCellWithIdentifier("CustomCell") as!
CustomCell
타겟-액션의 액션 메소드에서 센더 타입 캐스팅에서도 as!를 쓰게 된다.
@IBAction func handleSegmentChange(sender : AnyObject) {
let segmentedControl = sender as! UISegmentedControl
println("Selection : \(segmentedControl.selectedSegmentIndex)")
}
NSArray나 NSDictionary 에서도 사용하게 된다.
상수 초기화
Swift 1.1 에서 상수는 선언하면서 초기값을 설정해야한다. 1.2 부터 상수를 선언하고 사용하기 전에만 초기값을 설정하면 된다.
let condition = true
let fileName : String
if condition {
fileName = "image1.png"
}
else {
fileName = "image2.png"
}
연산자

Swift 1.1에서 |= 연산자를 사용할 수 있다.
var i = true
i |= false
Swift 1.2에서는 안된다. 다음과 같이 작성해야 한다.
var i = true
Set 타입
Set 타입이 생겼다.
var letters = Set<Character>()
var favoriteGenres : Set = ["Rock", "Classical", "Hip hop"]
외부 파라미터 이름
메소드의 파라미터 중 두 번째 파라미터부터 외부 파라미터 이름을 사용해서 호출한다. 다음은 예제로 사용할 코드다. 메소드에 3개의 파라미터가 있고 마지막 파라미터의 타입이 클로저다.
class MyClass {
func add(val1 : Int, val2 : Int, handler : (Int)->Void ) {
handler(val1 + val2)
}
}
Swift 1.1에서, 파라미터 중 마지막 파라미터가 클로저라면 외부 파라미터 이름을 생략할 수 있다.
var obj = MyClass()
obj.add(1, val2: 3, {(result : Int) -> Void in
println("1 + 3 = \(result)")
})
Swift 1.2에서, 마지막 파라미터가 클로저 타입이라 해도 외부 파라미터 이름을 명시적으로 작성해야 한다.
obj.add(1, val2: 3, handler: {(result : Int) -> Void in
println("1 + 3 = \(result)")
})
Incremental Build
Xcode 6.3 에서의 가장 큰 변화는 Incremental Build다. 6.3 이전에는 소스 코드 일부만 변경해도 전체를 컴파일 했지만 Xcode 6.3부터는 변경된 부분만 컴파일하는 Incremental Build를 지원한다.
현재 프로젝트에서 빌드 시간 테스트를 해보니 다음과 같다.
테스트 환경 : 5k iMac
Xcode 6.2 전체 빌드 : 46, 44초 코드 일부 수정 후 빌드 : 27, 25초 |
Xcode 6.3 전체 빌드 : 53, 55초 코드 일부 수정 후 빌드 : 6, 5.6초 |
빌드 시간이 확실히 줄었다!
Swift 언어 변환 기능
Xcode에는 Swift 코드 변환 기능을 제공한다.

코드 변환 기능을 사용하면 다음과 코드를 비교하면서 수정할 수 있다.
