iOS 공부하는 감자

Day12) 옵셔널 본문

22 베이직 챌린지

Day12) 옵셔널

DongTaTo 2022. 1. 14. 19:01
반응형

옵셔널

  • 타입 이름 뒤에 ? 키워드를 붙여서 표현한다.  
  • 변수나 상수의 값이 nil일 수도 있다는 것을 의미한다. (값이 있을수도 없을수도 있다는 뜻)
  • 값이 존재하지 않을 경우에 발생 가능한 오류(런타임오류)를 방지하기 위해 사용된다. (불확실성을 방지)

 

옵셔널을 사용하는 이유

  • 함수에 전달되는 매개변수 값이 잘못된 경우, 제대로 처리되지 못했음을 nil 반환으로 표현
  • 함수의 매개변수가 필수적이지 않을 때 해당 매개변수의 타입을 옵셔널로 정의
  • nil 가능성을 문서화하지 않고, 코드만으로 표현 가능 (ex-this value can be nil 같은 주석이 필요하지 않음)
  • 예외 상황을 최소화하는 안전한 코딩이 가능함

 

 

옵셔널 정의

  • 옵셔널은 열거형으로 정의되어 있다.
  • public enum Optional<Wrapped> : ExpressibleByNilLiteral {
        case none
        case some(Wrapped)
        public init(_ some: Wrapped)
        // ... 중략
    }
  • 값이 nil인 경우 none 케이스
  • 값이 있는 경우 some 케이스 (연관값으로 Wrapped가 있는데 이곳에 값이 할당됨)

 

  • 옵셔널 자체가 열거형이기 때문에 옵셔널 변수는 switch구문을 통해서도 값의 유무를 확인할 수 있다.
  • func checkOptionalValue(value optionalValue: Any?) {
        switch optionalValue {
        case .none:
            print("This Optional variable is nil")
        case .some(let value):
            print("Value is \(value)")
        }
    }
    
    var myName: String? = "dong"
    checkOptionalValue(value: myName)    // Value is dong
    
    myName = nil
    checkOptionalValue(value: myName)    // This Optional variable is nil
  • where절을 이용하여 여러 케이스의 조건을 검사하는 코드
  • let numbers: [Int?] = [2, nil, -4, nil, 100]
    
    for number in numbers {
        switch number {
        case .some(let value) where value < 0:
            print("Negative value!! \(value)")
        case .some(let value) where value > 10:
            print("Large Value!! \(value)")
            
        case .some(let value):
            print("Value \(value)")
        
        case .none:
            print("nil")
        }
    }

 

옵셔널 추출

옵셔널 강제 추출

  • 가장 간단하지만 위험한 방법 (런타임 오류의 발생 가능성이 높다.)
  • 옵셔널을 만든 의미가 무색해지는 방법
  • 옵셔널 값 뒤에 느낌표(!)를 붙여주면 옵셔널을 강제로 추출하여 반환 (만약 값이 nil이라면 런타임 오류 발생)
  • let someOptionalInt: Int? = 3       // Optional(3)
    
    let forced: Int = someOptionalInt!  // 3

옵셔널 바인딩

  • 옵셔널에 값이 있다면 추출한 값을 일정 블록(if, while) 안에서 사용 가능한 상수나 변수로 할당하여 옵셔널이 아닌 형태로 사용할 수 있도록 한다.
  • if 또는 while 구문 등과 결합하여 사용 가능하다.
  • var myName: String? = "dong"
    
    // 옵셔널 바인딩을 통한 임시 상수 할당
    if let name = myName {
        print("My name is \(name)")
    } else {
        print("My name == nil")
    }
    // My name is dong
    
    //--------------------------------------------------------------
    
    // 옵셔널 바인딩을 통한 임시 변수 할당
    if var name = myName {
        name = "wizplan"      // 변수이므로 내부에서 변경이 가능
        print("My name is \(name)")
    } else {
        print("My name == nil")
    }
    // My name is wizplan
  • var myName: String? = "dong"
    var yourName: String? = nil
    
    // friend에 바인딩이 되지 않으므로 실행되지 않는다.
    if let name = myName, let friend = yourName {
        print("We are friend! \(name) & \(friend)")
    }
    
    
    yourName = "eric"
    
    if let name = myName, let friend = yourName {
        print("We are friend! \(name) & \(friend)")
    }
    // We are friend! dong & eric

 

 

 

 

Hola

반응형

'22 베이직 챌린지' 카테고리의 다른 글

Day14) 객체지향 프로그래밍  (0) 2022.01.16
Day13) 타입캐스팅  (0) 2022.01.15
Day11) 프로토콜, 익스텐션  (0) 2022.01.13
Day10) 클래스와 상속  (0) 2022.01.12
Day9) 메서드, 접근제한자, Static  (1) 2022.01.11