본문 바로가기

code snippet

[iOS] Swift 1.2

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까지 타입 캐스팅은 다음과 같았다.


  • 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)")

}


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

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 코드 변환 기능을 제공한다.




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







반응형