ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [작성중] [Swift] Optional Unwrapping - 옵셔널 바인딩(if let vs guard let)
    ► Swift 2023. 6. 30. 20:10
    반응형

    두서없이 써논 글입니다!

     

    /*  swift     */
    
    /*
    
     [1.optional binding]
    
     swift에서 정말 많이 씀
    
     안전하게 optional 값을 unwrapping 할 수 있음 (아래의 3가지 Syntax 활용)
    
    */
    
    /*
    
    if let name: Type = OptionalExpression {
    
    }
    
    while let name: Type = OptionalExpression{
    
    }
    
    guard let name: Type = OptionalExpression else{
    
    }
    
     */
    
    //while문은 거의 사용안해서 제외하고 설명
    
    
    
    let optionalNum1: Int? = 4  //4
    
    let optionalNum2: Int? = nil    //nil
    
    
    
    //[ 2.if let ]
    
    let optionalNum:Int? = 4
    
    //let optionalNum: Int? = nil
    
    
    
    if let nonOptionalNum = optionalNum {
    
    //    The 'optionalNum' is not nil
    
        print(optionalNum)  //Optional(4)
    
        print(nonOptionalNum)   //4
    
    } else {
    
    //    The 'optionalnum' is nil
    
        print(optionalNum)
    
    }
    
    /* optionalNum은 여전히 Optional type
    
     nonOptionalNum은 optionalNum을 unWrapping한 값 */
    
    /* nil이 아니면 if let 스코프
    
     nil이면 else 스코프
    
    */
    
    
    
    /*
    
     1. if let줄에 optionalNum에서 nil 체크.
    
     2. nil이 아니면 unwrapping한 값을 nonOptionalNum으로 대입함.
    
     3.nil이면 if구문을 거치지 않고 else로 이동. 고러므로 nonOptionalNum은 사용불가
    
     */
    
    
    
    
    
    /*
    
     tips
    
     1. optionalnum과 nonOptionalNum 을 각각 이름짓기 번거로와서 똑같이 써도 됨.
    
     2.
    
     여러개의 옵셔널 타입을 바인딩 할 수 있음.
    
     name, age 모두 nil이 이나여야 if구문이 true가 됨.
    
     
    
     let name: String? = nil
    
     let age: Int? = nil
    
     if let name = name, let age = age{
    
     }
    
     3.
    
     condition을 넣어 줄 수 있음.
    
     name,age가 nil 이여야하고, age 값이 5보다 커야 true
    
     
    
     if let name = name, let age = age, age > 5{
    
     }
    
     */
    
    //[3. guard let]
    //quard문은 특성상 함수(메서드)에서만 쓰이며, guard 구문의 조건을 만족하지 못하면 else문으로 빠져서 함수를 종료시킬때 사용함(return)
    //guard문은 함수안에서만 작동함. 아래 예제는 함수밖에 구현한거라 참고만하기.
    let op: Int? = 4
    guard let nonOp = op else {
        //    The 'op' is nil
        return
    }
    print(nonOp)
    //The 'op' is not nil
    
    /*
     1. op이 nil인지 체크
     2. nil이 아니니 경우, else로 빠지지 않고 guard문 밖으로 나옴
     print(nonOp)이 4라고 출력됨
     3.nil인 경우, else로 빠져서 return함.
     else에서는 nonOp 사용 불가.
     
     */
    /* op은 여전히 Optional type
     nonOp의 scope은 guard 구문밖이기때문에 밖에서만 사용가능. */
    
    /*
     guard let도 if let과 같이 nonOptional type과 optional type의 이름을 같게 사용할 수 있음. 단, 함수(메서드)의 매개변수로 들어온 표현식에 한해서만 가능
     그외에는 안됨. scope문제일거라고 추측하지만 잘 모르겟음
     
     --- 가능한경우
     함수(메서드)로 넘어온 파라미터 값(임시 상수 혹은 변수)를 바인딜할 경우
     func test(_ name:String?){
        guard let name = name else {
            return
        }
        print(name)
     }
     
     --- 불가능한 경우
     함수(메서드) 내에서 선언한 상수 혹은 변수를 바인딩할 경우
     func test() {
        let num: Int? = 4
        guard let num = num else {
            return
        }
     }
     */
    
    /*
     if let처럼 옵셔널바인딩을 하나의 guard문에 연속으로 사용할 수도 있고, condition을 넣을 수 있음
     
     func test(_ name: String?, _ age: Int?){
        guard let name = name, let age =  age, age < 5 else {
      }
     }
     */
    
    
    //    .....
    
    
    
    
    //참고링크: https://babbab2.tistory.com/17
    반응형
Designed by Tistory.