is, as, as?, as!

냐옹·2024년 7월 15일
0

IOS

목록 보기
27/32

타입캐스팅

  • 인스턴스의 타입을 확인하거나, 해당 인스턴스를 슈퍼클래스하위 클래스로 취급하는 방법이다.

  • swift에서 타입 캐스팅은 isas 연산자로 구현한다.

  • 타입 캐스팅을 사용하여 타입이 프로토콜에 적합한지 여부도 확인할 수 있다.

is

is연산자는 타입을 체크하는 연산자로서, 반환값은 bool형이다.

표현식 is 자료형
  • 타입을 체크하는 연산자로, 런타임 시점에 실제 체크가 이루어진다.
  • 표현식이 자료형과 동일하거나, 표현식이 자료형의 서브클래스인 경우에 true
  • 그 외의 경우는 false
class Human{}
class Teacher : Human{}

let teacher : Teacher = .init()
teacher is Teacher	// True
teacher is Human 	// True
class Human {
    let name: String
    init(name: String) {
        self.name = name
    }
}
class Teacher: Human { }
class Student: Human { }
 
 
let people: [Human] = [
    Teacher.init(name: "김선생"),
    Student.init(name: "박제자"),
    Student.init(name: "유제자")
]
  • 자료형에 민감한 swift이지만, 업캐스팅으로 인하여 TeacherStudent 자료형을 저장할 수 있다.
  • TeacherStudent의 슈퍼클래스가 Human으로 동일하기에, Human이란 클래스로 둘다 업캐스팅한 것이다.
for human is people{
	if human is Teacher{
    	print("Teacher")
    }else if human is Student{
    	print("Student")
    }
}

as

표현식 as  (변환 할)자료형
표현식 as? (변환 할)자료형
표현식 as! (변환 할)자료형
  • 표현식의 자료형이 변환할 자료형과 호환된다면, 변환할 자료형으로 캐스팅된 인스턴스를 리턴한다.
  • 상속관계인 업캐스팅다운캐스팅에서 사용한다.
  • AnyAnyObject 자료형을 사용할 경우, 상속 관계가 아니어도 예외적으로 사용할 수 있다.

업캐스팅과 다운캐스팅

  • 업캐스팅
    서브 클래스 인스턴스를 슈퍼클래스의 자료형으로 참조한다.
    업캐스팅은 항상 성공한다.
    아래와 같이 as연산자를 사용해서 할 수도 있다. ( 컴파일 시점에 캐스팅 가능 여부를 결정한다 )

class Human {
    let name: String = "Sodeul"
}
class Teacher: Human {
    let subject: String = "English"
}
class Student: Human {
    let grade: Int = 1
}

let human = Teacher.init() as Human

출처 : https://babbab2.tistory.com/127

0개의 댓글