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)
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"
}
}
타입 변환(down cast)
Swift 1.1까지 타입 캐스팅은 다음과 같았다.
- as
- as?
Swift 1.2에 as!가 추가됐다. 이제 다운 캐스팅은 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)")
}
상수 초기화
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
i = i || false
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 코드 변환 기능을 제공한다.
코드 변환 기능을 사용하면 다음과 코드를 비교하면서 수정할 수 있다.
'code snippet' 카테고리의 다른 글
[Rocket.chat] HTTP, HTTPS, URL 설정 (0) | 2022.01.20 |
---|---|
[iOS] 웹뷰(WKWebView)에서 네이티브로 메세지 전달. 에러 수정 기록 (0) | 2020.03.10 |
[iOS] 노티 옵저버 등록과 해제 (0) | 2015.03.13 |
[Node.js] 서버 IP 얻기 (0) | 2015.03.05 |
[iOS] 뷰의 아웃렛 작성시 weak? strong? (0) | 2014.12.28 |