티스토리 뷰

스위프트는

  • 데이터 타입 안전을 위해서 서로 다른 타입끼리의 값 교환을 제한함

1. 기존 언어의 타입 변환과 스위프트 타입 변환

  • 실패할 수 있는 이니셜라이져
// 실패 할 수 있는 이니셜라이져
var string:Value String = "000111222"
var integerValue: Int? = Int(stringValue)

print(integerValue) // Optional(111222)

stringValue = "AAA000111"
integerValue = Int(stringValue)

print(integerValue) // nil

2. 스위프트 타입캐스팅

  • 스위프트의 타입캐스팅은 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인양 행세할 수 있는 방법
  • is와 as로 타입을 확인하거나 다른 타입으로 전환(cast)할 수 있음
  • 프로토콜 준수 여부 확인 가능
class Car {
    let name: String
    let door: Int

    var description: String {
        return "\(name) is \(String(door))door car"
    }

    init(door:Int) {
        self.name = "Car"
        self.door = door
    }
}

class Z4: Car {
    var price: Int

    override var description: String {
        return "\(name) has \(String(door)) door and price is \(String(price))만원"
    }

    init(door: Int, price: Int) {
        self.price = price
        super.init(door: door)
    }
}

class EV6: Car {
    var speed: String

    override var description: String {
        return "\(name) has \(String(door)) door and \(speed) speed"
    }

    init(door: Int, speed: String) {
        self.speed  = speed
        super.init(door: door)
    }
}
  • Z4 와 EV6는 Car 클래스를 상속
  • Car의 프로퍼티를 Z4와 EV6가 가지고 있음
  • Car는 Z4나 EV6인 척 할 수 없지만, Z4와 EV6는 Car인 척 할 수 있음
    → Z4와 EV6는 Car의 모든 특성을 가지고 있기 때문

3. 데이터 타입 확인

  • is를 사용하여 인스턴스가 어떤 클래스의 인스턴스인지 타입을 확인할 수 있음
  • 인스턴스가 해당 클래스의 인스턴스거나 그 자식클래스의 인스턴스면 true, 그렇지 않으면 false 반환
let car: Car = Car(door: 5)
print(car.description) // Car is 5 door car

let myZ4: Z4 = Z4(door: 2, price: 8000)
print(myZ4.description) // Car has 2 door and price is 8000만원

let yourEV6 : EV6 = EV6(door: 5, speed: "fast")
print(yourEV6.description) // Car has 5 door and fast speed

print(car is Car) // true
print(car is Z4) // false
print(car is EV6) //false

print(myZ4 is Car) // true
print(yourEV6 is Car) // true

print(myZ4 is EV6) // false
print(yourEV6 is EV6) // true
  • car는 Z4나 EV6가 될 수 없지만, myZ4나 yourEV6는 Car가 될 수 있음
  • myZ4와 yourEV6는 서로 다른 타입

메타 타입(Meta Type) 타입

  • 타입의 타입
  • 클래스, 구조체, 열거형 타입 등 타입의 타입
  • ‘타입 그 자체'가 하나의 타입으로 또 표현될 수 있음
  • 타입의 이름 뒤에 .Tpye을 붙이면 메타 타입
  • 프로토콜 타입의 메타 타입은 .Protocol
  • .self를 사용하면 타입을 값으로 표현할 수 있음
  • SomeClass.self 표현하면 SomeClass의 인스턴스가 아닌 SomeClass를 값으로 표현한 값을 반환
  • SomProtocol.self이라고 표현하면 SomeProtocol을 준수하는 타입의 인스턴스가 아닌 SomeProtocol 프로토콜을 값으로 표현한 값 반환
protocol SomeProtocol { }
class SomeClass: SomeProtocol { }

let intType: Int.Type = Int.self
let stringType: String.Type = String.self
let classType: SomeClass.Type = SomeClass.self
let protocolProtocol: SomeProtocol.Protocol = SomeProtocol.self

var someType: Any.Type

someType = intType
print(someType) // Int

someType = stringType
print(someType) // String

someType = classType
print(someType) // SomeClass

someType = protocolProtocol // SomeProtocol
print(someType)
  • 인스턴스 self와 타입 self
    • .self 표현은 값 뒤에 써주면 그 값 자신을 반환
    • 타입 이름 뒤에 써주면 타입을 표현하는 값을 반환
    • “stringValue”.self 는 “stringValue”를, String.self는 String 타입 그 자체
댓글