Swift3(스위프트3)

swift3 스위프트3 옵셔널 체이닝 / nil 병합 연산자란?

알통몬_ 2017. 7. 10. 16:11
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 옵셔널 체이닝과 nil 병합 연산자에 대해서 공부합니다.


- 옵셔널 체이닝 

  : 옵셔널 요소 내부의 프로퍼티로 또 옵셔널이 연속적으로 연결되는 경우에 유용하게 사용할 수 있습니다.


예제)

class Student{

   var name : String

   var school : School?

   init ( name : String) {

      self.name = name

   }

}


class School {

   var schoolName : String

   var rank : String?

   var grade : String?

   init(schoolName : String) {
     
      self.schoolName = schoolName

}

let altong : Teenagers? = Teenagers("박알통")

let tistorySchool : School? = MOrHSchool("경성고등학교")

* 옵셔널 체이닝의 결과 값은 nil 값이 나올 수도 있기 때문에 결과 타입도 옵셔널입니다.


위 두 클래스를 통해 예제를 보겠습니다.

예제) 학생이 있습니다.. 이 학생이 학교를 다니는지, 몇 학년인지, 몇 등을 하는지 궁금하다면?

func isStudent(altong : Student?) {

   if let altong = altong { // 매개 변수로 입력된 값이 Teenagers 타입인지 확인합니다.

      if let school = altong.school{ // 학교를 다니는지 확인합니다.

         if let grade = school.grade { // 학년을 확인합니다.

            if let rank = school.rank { // 등수를 확인합니다.

              print("\(rank) 등 입니다")

            }else {

              print("학생이 아닙니다.")

            }

         }

      }

   }

}


위 함수는 조건문이 너무 많죠? 먼저 학생인지 확인하고 학교를 다니는지 확인하고, 학년을 확인하고, 등수를확인하고 ;;  옵셔널 체이닝을 사용하면 좀 더 간결한 문장으로 같은 조건을 검사할 수 있습니다.

func isStudentOptional(altong : Student?) {

   if let rank = altong?.school?.grade?.rank {

      print("\(rank) 등입니다.")

   } else {

      print("학생이 아닙니다")

   }

}

isStudent(altong) // 학생이 아닙니다


altong?.school?.grade?.rank // nil

altong?.school = tistorySchool

altong?.school // Optional(School)


altong?.school?.grade // nil

altong?.school?.grade = "3학년"

altong?.school?.grade // Optional(String)


altong?.school?.grade?.rank // nil

altong?.school?.grade?.rank = "전교 3"

altong?.school?.grade?.rank // 전교3등입니다.

옵셔널 체이닝을 사용한다면 더 간단하게 표현이 가능합니다.


다음은 nil 병합 연산자에 대해 공부합니다.

var stu1 : String

물음표 2개 앞의 값이 nil일 경우 물음표 뒤의 값을 변수에 할당해주고,

nil이 아니라면 물음표 앞의 값을 할당해줍니다.

stu1 = altong?.school?.grade?.rank ?? "학생이 아닙니다."

print(stu1) // 전교3등입니다.

altong?.school?.grade?.rank = nil

print(stu1) // 학생이 아닙니다.


이상입니다. 이번 포스팅 내용은 조금 이해가 안 가는 부분이 있어서 추가적인 공부가 필요할 것 같습니다 ㅎㅎ 추가 공부 후 포스팅 내용이 수정될 수도 있습니다.


감사합니다.


다음 포스팅에서는 타입 캐스팅에 대해서 공부합니다~

반응형