You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
letperson2=Person()letstudent2=Student()letundergraduate2=Undergraduate()letpeople=[person1, person2, student1, student2, undergraduate1, undergraduate2]// 학생 인스턴스의 갯수를 세고 싶다.varstudentNumber=0
for someOne in people {
if someOne is Student{
studentNumber +=1}}
as 연산자 (type cast operator)
인스턴스 타입의 (메모리구조에 대한) 힌트를 변경하는 - as 연산자
Upcasting (업캐스팅)
인스턴스 as 타입
하위클래스의 메모리구조로 저장된 인스턴스를 상위클래스 타입으로 인식
Downcasting (다운캐스팅) (실패가능성이 있음)
인스턴스 as? 타입 / 인스턴스 as! 타입
as? 연산자
참이면 반환타입은 Optional타입
실패시 nil 반환
as! 연산자
참이면 반화타입은 Optional타입의 값을 강제 언래핑한 타입
실패시 런타임 오류
letppp= person as?Undergraduate// Undergraduate? 타입
if let newPerson = person as?Undergraduate{// if let 바인딩과 함께 사용 (옵셔널 언래핑)
newPerson.major
print(newPerson.major)}letperson3:Undergraduate= person as!Undergraduate
person3.major
업캐스팅
letundergraduate2:Undergraduate=Undergraduate()
undergraduate2.id
undergraduate2.name
undergraduate2.studentId
undergraduate2.major
//undergraduate2.name = "길동"letperson4= undergraduate2 asPerson// 항상 성공 (컴파일러가 항상 성공할 수 밖에 없다는 것을 알고 있음)
person4.id
person4.name
//person4.studentId//person4.major
Bridging (브릿징)
서로 호환되는 형식을 캐스팅해서 쉽게 사용하는 것
스위프트에서는 내부적으로 여전히 Objective-C의 프레임워크를 사용하는 것이 많기 때문에
서로 완전히 상호 호환이 가능하도록 설계해놓았음(completely interchangeable)
타입 캐스팅을 강제(as!)할 필요 없음
letstr:String="Hello"letotherStr= str asNSString
Any와 AnyObject 타입
스위프트에서 제공하는 불특정한 타입을 다룰 수 있는 타입을 제공
Any 타입
기본 타입(Int, String, Bool, ...) 등 포함, 커스텀 클래스, 구조체, 열거형, 함수타입
까지도 포함해서 어떤 타입의 인스턴스도 표현할 수 있는 타입 (옵셔널타입도 포함)
단점
저장된 타입의 메모리 구조를 알 수없기 때문에, 항상 타입캐스팅해서 사용해야함 ⭐️
장점
모든 타입을 담을 수 있는 배열을 생성 가능
varsome:Any="Swift"
some =10
some = 3.2
classPerson{varname="이름"varage=10}classSuperman{varname="이름"varweight=100}letarray:[Any]=[5,"안녕", 3.5,Person(),Superman(),{(name:String)inreturn name}](array[1]as?String)?.count
AnyObject 타입
어떤 클래스 타입의 인스턴스도 표현할 수 있는 타입
letobjArray:[AnyObject]=[Person(),Superman(),NSString()]//objArray[0].name(objArray[0]as?Person)?.name
// 타입캐스팅 + 분기처리
for (index, item) in array.enumerated(){// (0, 5)// (1, "안녕")// (2, 3.5)// ...
switch item {case is Int:// item is Intprint("Index - \(index): 정수입니다.")caseletnum as Double:// let num = item as Doubleprint("Index - \(index): 소수 \(num)입니다.")case is String:// item is Stringprint("Index - \(index): 문자열입니다.")caseletperson as Person:// let person = item as Personprint("Index - \(index): 사람입니다.")print("이름은 \(person.name)입니다.")print("나이는 \(person.age)입니다.")case is (String)->String:// item is (String) -> Stringprint("Index - \(index): 클로저 타입입니다.")default:print("Index - \(index): 그 이외의 타입입니다.")}}
옵셔널값의 Any 변환
의도적인 옵셔널값의 사용
Any는 모든 타입을 포함하므로, 의도적인 옵셔널값을 사용하려면 Any타입으로 변환하면
컴파일러가 알려주는 경고를 없앨 수 있음
왜?
옵셔널값은 임시적인 값일 뿐이므로, 일반적으로 개발자들은 옵셔널 바인딩을 해서
언래핑해서 안의 값을 사용해야함 ===> 그래서 경고를 통해 알려줌
(Any로 변환하겠다는 것은 그 자체를 사용하겠다는 의미임 ===> 경고 없음)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
타입 캐스팅
is 연산자
인스턴스 is 타입 (이항연산자)
as 연산자 (type cast operator)
Upcasting (업캐스팅)
Downcasting (다운캐스팅) (실패가능성이 있음)
as? 연산자
as! 연산자
Bridging (브릿징)
Any와 AnyObject 타입
Any 타입
까지도 포함해서 어떤 타입의 인스턴스도 표현할 수 있는 타입 (옵셔널타입도 포함)
단점
장점
AnyObject 타입
옵셔널값의 Any 변환
컴파일러가 알려주는 경고를 없앨 수 있음
왜?
언래핑해서 안의 값을 사용해야함 ===> 그래서 경고를 통해 알려줌
(Any로 변환하겠다는 것은 그 자체를 사용하겠다는 의미임 ===> 경고 없음)
Beta Was this translation helpful? Give feedback.
All reactions