STUDY/Swift & iOS

Swift 문법 기초 6

sinawi95 2022. 6. 25. 15:42
728x90

옵셔널 심화

옵셔널체이닝

매번 nil을 확인하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할수 있음

class Person {
    var name: String
    var job: String?
    var home: Apartment?
    init(name: String) {
        self.name = name
    }
}
class Apartment {
    var buildingNumber: String
    var roomNumber: String
    var `guard`: Person?
    var owner: Person?
    init(dong: String, ho: String) {
        buildingNumber = dong
        roomNumber = ho
    }
}
let dg: Person? = Person(name: "Donggun")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")

// 우리집의 경비원의 직업이 궁금한경우
// 1) 옵셔널 체이닝을 사용하지 않고 확인
func guardJob(owner: Person?) {
    if let owner = owner {
        if let home = owner.home {
            if let `guard` = home.guard {
                if let guardJob = `guard`.job {
                    print("우리집 경비원의 직업은 \\(guardJob)입니다")
                } else {
                    print("우리집 경비원은 직업이 없어요")
                }
            }
        }
    }
}
guardJob(owner: dg)

// 2) 옵셔널 체이닝 사용
func guardJobWithOptionalChaining(owner: Person?) {
    if let guardJob = owner?.home?.guard?.job {
        print("우리집 경비원의 직업은 \\(guardJob)입니다")
    } else {
        print("우리집 경비원은 직업이 없어요")
    }
}
guardJobWithOptionalChaining(owner: dg)
  • if로 매번 확인하지 않아도 옵셔널에서 nil 값이 나오는 경우 nil이 들어감

nil 병합 연산자 ??

Optional ?? value
  • 중위 연산자
  • 옵셔널 값이 nil인경우 우측의 값 반환
  • 띄어쓰기 주의

타입캐스팅

인스턴스 타입을 확인하는 용도

클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할수 있는지 확인하는 용도

  • 주의할점: 다른 언어의 타입캐스팅처럼 (int) a 와 같은 방식인 Int(a) 는 타입캐스팅이 아닌 인스턴스 복사임

타입 확인 is

  • is를 사용해서 타입을 확인할수 있음
  • 상속받은 클래스인경우 부모 타입까지 true로 출력

업캐스팅 as

  • 부모클래스의 인스턴스로 사용할수 있도록 컴파일러에게 타입 정보를 전환해줌
  • Any 혹은 AnyObject로도 변환 가능.
  • 암시적으로 처리되므로 꼭 필요한 경우가 아니면 생략해도 됨

다운캐스팅

as? 나 as! 를 사용해서 자식 클래스의 인스턴스로 사용할수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해줌

조건부 다운캐스팅 as?

캐스팅에 실패(캐스팅하려는 타입에 부합하지 않는 인스턴스)하면 nil을 반환함

결과 타입은 옵셔널 타입

강제 다운캐스팅 as!

캐스팅에 실패하면 런타임오류 발생

캐스팅에 성공하면 옵셔널이 아닌 일반 타입 반환

 

assert 와 guard

런타임 도중 생성되는 연산의 결과값을 확인하고 안전하게 처리가능함

Assertion

assert(condition[, message])

디버깅 모드에서만 동작함(배포하는 애플리케이션에서 제외)

주로 디버깅 중 조건의 검증을 위해 사용

  • precondition은 배포환경에서도 사용가능

빠른 종료 guard

잘못된 값이 전달되면 특정 실행 구문을 빠르게 종료함

디버깅 모드 뿐만아니라 모든 조건에서 동작함

guard의 else 블럭 내부에는 특정 코드 블럭을 종료하는 지시어(return , break)이 필요함

func functionWithGuard(age: Int?) {
    guard let unwrappedAge = age,
        unwrappedAge < 130,
        unwrappedAge >= 0 else {
        print("나이값 입력이 잘못되었습니다")
        return
    }
    print("당신의 나이는 \\(unwrappedAge)세입니다")
}

'STUDY > Swift & iOS' 카테고리의 다른 글

Swift 문법 기초 8  (0) 2022.06.27
Swift 문법 기초 7  (0) 2022.06.27
Swift 문법 기초 5  (0) 2022.06.21
Swift 문법 기초 4  (0) 2022.06.20
Swift 문법 기초 3  (0) 2022.06.13