옵셔널 바인딩, 체이닝 이론편에 이어서 실습편이다.
먼저 이론편을 보고 오기를 추천한다.
음.. 우선 Option 이라는 이름으로
파일을 하나 생성해준다.
음... 심플하게 하나 만들어보겠다.
요렇게 일단은 작성해보았다.
물론.. let poodname: String 부분에
var poodname: String = "" 이런식으로 하면,
poodname 프로퍼티의 값을 수정할 수 있게 된다.
지금 People 구조체에서 poodname을
let으로 정의하면 불변(immutable)으로 선언되어,
생성 이후에는 값을 변경할 수 없는 반면,
var로 선언하면 값을 수정할 수 있다.
이 옵셔널을 쓰고 안쓰고
같은 결과물을 만들어 낼 수 있다.
이런식으로
나중에 좋아하는 음식이
생각이 났을 때
이런식으로 만들 수는 있는데
약간은 의미가 이상한거다..
어? 좋아하는 음식이름이
빈칸이었을 때..
누군가는 당연히 직관적으로
"아하~ 이름이 없을 때!" 라고
알아들을 수 있지만,
"음... 없을 때 라기보다는
빈칸일 때 아직없다는 건가?"
라고 혼동이 생기기 때문에 정확하게
nil 이라는 없다라는 표현이 있다.
이렇게 말이다.
여기서 이제 아래처럼 에러가 날 것이다.
왜냐하면,
"StayJun.poodname" 이 변수는 반드시
보장이 되어야 하기 때문이다.
poodname이 옵셔널이기 때문이라서다.
때문에 여기에 nil이 들어갈 수 있다.
그러면 어떻게 해야하는가?
어떤식으로 바인딩을 해야하는가?
바로,
아래와 같이 바인딩을 해줄 수 있다.
"Text("\(StayJun.name) 좋아하는 음식이름은 \(poodname)")" 이 부분에서
"\(StayJun.poodname)" 이부분이 있어야 할 부분이
현재는 "\(poodname)" 이렇게 되어있는걸 알 수 있다.
왜 그런가?
"StayJun.poodname" 이 옵셔널인 녀석을
"poodname" 이라고 부르기로 했기 때문이다.
이를 조금 해석해보자면,
"poodname"이 nil이 아니라면,
Text("\(StayJun.name) 좋아하는 음식이름은 \(poodname)")
이렇게 실행이되고,
아니라면,
Text("이름은 \(StayJun.name) 좋아하는 음식이름은 없다.")
이렇게 실행이 되도록 해놓았다.
나머지도 동일하게 바인딩을 해주면,
바인딩을 했으니,
옵셔널이 없이 써도 무관하겠다.
이상태에서 poodname를 지워보도록 하겠다.
결과는 어떻까?
이렇게, poodname이 없는걸 확인할 수 있다.
이런식으로 현재 가지고 있는 옵셔널 값을
새로운 변수에 넣어서
만약, "noel.poodname" 이 옵셔널을 깨서
값이 있다면, poodname 이변수에 넣고
현재 else가 따로 없지만,
처리 안해줄수도 있고 해줄수도 있는 부분이니,
이부분은 생략하도록 하겠다.
연습삼아서
하나만 더 해보겠다.
이번엔 MBTI라는 소재를 사용해보겠다.
이름은 꼭 있어야 하니,
옵셔널은 하지 말아보자.
이후 위 변수에서 MBIT를 넣어주겠다.
나의 MBTI는 INFJ이기 때문에
INFJ를 입력해주었다.
음... 이랬을 때 우선은
"mbti: MBTI(name: "INFJ")"
이 mbit는 옵셔널이기 때문에
일단, 아래 처럼 해주자.
이렇게 보았을 때,
"StayJun" 자체가 사람이 있을 수 있고,
없을 수도 있는 옵셔널이다.
옵셔널인 사람 안에 mbti도 옵셔널인 상태가 된다.
그렇다면, 아래 뷰에서는
이미지를 보면,
빨간상자 안에 있는 StayJun은 옵셔널이며,
얘는 옵셔널이 아닌거다.
옵셔널 바인딩을 한것이다.
StayJun이 StayJun 안이라면,
"if let mbti = StayJun.mbti"
이렇게 말이다.
이건 옵셔널 안에 옵셔널이 있다면,
이러한 형식으로 들어가야 하는 부분임을
강조하고 있는 것이다.
만약 name이 "?" 라면?
이런식으로 되겠다.
이렇게 작업을 하게 되면..
사실상... 너무 괴롭다..

지금 이 옵셔널을 안전하게 해결 하기 위해서
옵셔널을 바인딩 하는건 너무 좋지만,
그걸 여러번에 걸쳐 걸쳐 하는 건
너무 괴로운 일이다.
그래서 나온게 바로 체인이다.
이러한 형식이다.
이처럼 체인이 연결되어있는걸 알 수 있다.
그리고 중간에 StayJun이 nil일 경우 바로 else로 가지고
마찬가지로 mbti가 nil이어도 바로 else로 가진다.
이 체인중 한부분만 끊어져도 nil이 된다.
그렇지 않고 다 있다면,
원하는 이름이 나온다.
이렇게 해주면,
결과를 보니 INFJ라고 나온다.
음~ 잘 나오는 것 같다.
그리고 그렇지 않을 경우엔
위에 드래그 된 부분을 지워버리면
No MBTI name 문구가 나오겠다.
이렇게 결과가 나오겠다.
그런데 애시당초
이렇게 내용을 없애버려도
No MBTI는 나온다.
이렇게 옵셔널에 대한 개념과
얘를 응용하고 활용하는 부분을
자주 연습해 놓으면,
훗날 더 멋진 개발자로
성장할 수 있지 않을까 싶다.
'IOS > Swift-TIL' 카테고리의 다른 글
[Swift-TIL] 예외처리 - 만약 에러가 발생한다면.. (이론편) (1) | 2024.11.05 |
---|---|
[Swift-TIL] 간단한 샘플 앱 만들어보기 (4) | 2024.11.04 |
[Swift-TIL] 옵셔널 바인딩, 체이닝 - 옵셔널 값을 안전하게 사용해 보기 (이론편) (0) | 2024.10.22 |
[Swift-TIL] 옵셔널 - 있을 수 있는 것 없는 것 (실습편) (0) | 2024.10.22 |
[Swift-TIL] 옵셔널 - 있을 수 있는 것 없는 것 (이론편) (0) | 2024.10.22 |