[swift] Swift에서 프로토콜의 타입 확인
Swift에서는 프로토콜을 사용하여 타입에 대한 추상화와 다형성을 구현할 수 있습니다. 프로토콜은 클래스, 구조체, 열거형 등 다양한 타입에 적용할 수 있으며, 해당 타입이 프로토콜을 준수하는지 확인할 수도 있습니다.
프로토콜 타입 확인하기
Swift에서는 is
연산자와 as?
연산자를 사용하여 프로토콜 타입을 확인할 수 있습니다.
protocol Printable {
func print()
}
struct Person: Printable {
func print() {
// 출력 로직 구현
}
}
class Animal: Printable {
func print() {
// 출력 로직 구현
}
}
let person: Printable = Person()
let animal: Printable = Animal()
if person is Printable {
print("person은 Printable 프로토콜을 준수합니다.")
} else {
print("person은 Printable 프로토콜을 준수하지 않습니다.")
}
if animal is Printable {
print("animal은 Printable 프로토콜을 준수합니다.")
} else {
print("animal은 Printable 프로토콜을 준수하지 않습니다.")
}
위의 예제에서는 Printable
프로토콜을 정의한 후, Person
구조체와 Animal
클래스가 Printable
프로토콜을 준수하도록 구현하였습니다. 이후 person
과 animal
의 타입을 Printable
로 선언하고, is
연산자를 사용하여 해당 타입이 Printable
프로토콜을 준수하는지 확인합니다.
다운캐스팅을 통한 프로토콜 타입 사용하기
프로토콜 타입을 사용할 때, 해당 타입의 구체적인 타입으로 다운캐스팅하여 사용할 수도 있습니다. 이때 as?
연산자를 사용하여 다운캐스팅하여 실패할 경우 nil
을 반환하도록 할 수 있습니다.
protocol Eatable {
func eat()
}
class Fruit: Eatable {
func eat() {
// 먹는 로직 구현
}
}
class Meat: Eatable {
func eat() {
// 먹는 로직 구현
}
}
let fruit: Eatable = Fruit()
let meat: Eatable = Meat()
if let fruit = fruit as? Fruit {
print("과일을 먹습니다.")
fruit.eat()
} else if let meat = meat as? Meat {
print("고기를 먹습니다.")
meat.eat()
}
위의 예제에서는 Eatable
프로토콜을 정의한 후, Fruit
클래스와 Meat
클래스가 Eatable
프로토콜을 준수하도록 구현하였습니다. 이후 fruit
과 meat
의 타입을 Eatable
로 선언하고, as?
연산자를 사용하여 해당 타입으로 다운캐스팅하여 사용합니다.