본문 바로가기
Swift

14. 타입 체크와 변환

by 루에 2015. 10. 14.
반응형

타입 체크와 변환


swift 언어는 강한 타입 체크 언어이므로 코드를 작성할 때 변수나 상수의 타입과 값의 타입을 잘 맞춰야 한다.


배열에 저장된 객체의 타입을 체크하려면 is 를 이용한다.

// is 타입 체크

let pets : [Animal] = [Dog("snu"), Cat("ya5ng"), Cat("laz")]


if pets[0] is Cat {

    print("고양고양")

}


// pets 배열이므로 직접 타입을 지정하면 에러 발생

let myCat : Cat = pets[1]


타입 변환은 as를 이용한다.

as : swift1.1까지 사용.

as? : 타입 변환에 실패하면 nil이 반환된다.

as! : 타입 변환이 안되면 런타임 에러가 발생한다. Swift 1.2부터 사용



Any


Swift의 모든 변수와 상수는 타입을 정해야 한다. 타입 선언을 명시적으로 하거나 대입하는 값에서 타입을 정한다. Any 타입은 타입을 정하지 않고 다양한 타입의 값을 다룰 때 사용한다.

var anyVar : Any = 3

anyVar = "3"    // Int -> String 대입


class Person {

}


anyVar = Person()   // String -> Class 대입


// 배열에 이용할 경우 다양한 값을 담을 있다

var anyArray : [Any] = [1, "2", 3.0]


Any와 유사한 것으로 AnyObject 프로토콜이 있다. AnyObject는 모든 클래스의 객체를 다룰 수 있는 타입으로 Objective-C에서 사용하는 id 타입에 해당한다. Objective-C 기반으로 작성된 API에서 id 타입이 Swift 언어에서는 AnyObject로 사용한다.


Any나 AnyObject는 메소드와 프로퍼티에 대한 정보가 없기 때문에 프로퍼티와 메소드를 사용할 수 없다. 값의 타입에 맞게 타입 캐스팅을 하고 사용한다.

var anyArray : [Any] = [1, "2", 3.0]


for one in anyArray {

    if one is String {

        print("문자열 \(one)")

    }

    else if one is Int {

        var i = one as! Int

        print(i + 1)

    }

}



타입 알리아스(type alias)


타입에 대한 이름을 설정하는 것으로 코드의 가독성을 높일 수 있다.

typealias Age = Int


var myAge : Age

myAge = 20


타입 알리아스는 클로저와 함께 사용하면 코드를 간결하게 작성할 수 있다.

func add(i: Int, j: Int, resultHandler: (Int) -> Void){

    let sum = i + j

    resultHandler(sum)

}



// typealias 적용해서 클로저 선언

// 함수는 같은 기능을 하지만 아래쪽이 간결하다

typealias ResultHandler = (Int) -> Void


func add(i: Int, j: Int, resultHandler: ResultHandler) {

    let sum = i + j

    resultHandler(sum)

}















반응형

댓글