[swift] 조건부 다운캐스팅을 이용한 타입 변환

스위프트에서는 클래스 타입뿐만 아니라 프로토콜과 같은 다양한 타입을 선언하고 사용할 수 있습니다. 때때로 한 타입을 다른 타입으로 변환해야 하는데, 이때 조건부 다운캐스팅을 사용할 수 있습니다.

조건부 다운캐스팅은 as? 키워드를 사용하여 수행됩니다. 만약 다운캐스팅에 실패하면 nil을 반환하게 됩니다. 조건부 다운캐스팅에는 다음과 같은 형태가 있습니다.

if let convertedInstance = instance as? DesiredType {
    // 조건부 다운캐스팅에 성공한 경우
    // convertedInstance를 사용하여 작업을 수행합니다
} else {
    // 조건부 다운캐스팅에 실패한 경우
    // 원하는 작업을 수행합니다
}

예를 들어, 다음과 같이 프로토콜을 사용하는 상황을 가정해 보겠습니다.

protocol Animal {
    func makeSound()
}

class Dog: Animal {
    func makeSound() {
        print("멍멍")
    }
}

class Cat: Animal {
    func makeSound() {
        print("야옹")
    }
}

let animals: [Any] = [Dog(), Cat()]

for animal in animals {
    if let soundMakingAnimal = animal as? Animal {
        soundMakingAnimal.makeSound()
    } else {
        print("소리를 낼 수 없는 동물입니다.")
    }
}

이 예제에서는 다운캐스팅을 통해 Animal 프로토콜을 준수하는 인스턴스인지 확인하고, 만약 그렇다면 해당 메소드를 호출합니다. 그렇지 않다면 해당 동물은 소리를 낼 수 없다는 메시지를 출력합니다.

조건부 다운캐스팅을 통해 타입의 안전한 변환을 수행할 수 있으며, 코드의 유연성을 높일 수 있는 강력한 도구입니다.

참고 자료: