작성
·
313
0
수고많으십니다.
closure_3 강의에서,
lazy var myClosure2 = {[weak self] in
print(self?.b ?? 0)
}
여기서 self뒤에 ?가 붙는 이유는 뭔가요? ?의 의미를 죄송하지만 여기서 한번 더 설명해주실 수 있으실까요?
myClass?.b = 11
myClass?.b
여기서 제가 중간에 놓친 설명이 있는 것 같기도 하고요. optional 인 Myclass를 unwrapping 하려면 !를 붙이는게 맞지 않나요? 그리고 myClass!.b로 실행해봐도 문제는 없는것 같구요. ?의 의미 한번 더 정리해주실 수 있으실까요.
답변 2
0
다른 부분은 일차적인 이해는 한 것 같습니다.
그런데 class 타입의 someClass를 myClosure2 가 self라는 이름의 옵셔널 타입으로 캡쳐한다는 것에서
var myClass : someClass? = someClass()
의 myClass와 self가 같은 것이라고 해석하는게 맞을까요?
backtick이라고 부르고 이미 있는 같은이름으로 된 이름을 만들고 싶을때나 원래 변수명으로 못 만드는 단어를 변수명으로 만들고 싶을때 씁니다.
self가 이미 있으니 그냥은 못 만들어서 백틱으로 감싸야 self를 만들수 있습니다.
swift언어 스펙이며 키보드 ₩ 누르면 나오는 기호입니다.
0
안녕하세요
weak는 약하게 참조한다는 의미이고 약한참조 한다는 것은 몇가지 의미가 있는데 그 중 하나가 언제든지 nil이 될 수 있는 옵셔널 타입을 뜻합니다.
클로저에서 [weak self]는 캡쳐리스트라고 해서 self와 같은 이름으로 해당타입을 옵셔널 타입으로 캡쳐하고 있다는 뜻입니다.
옵셔널타입의 멤버 접근시 물음표가 나오는건 옵셔널 체이닝이 가능한 상태를 말합니다.
이건 물음표 붙은 self가 nil일 경우 하위 멤버에 접근하지 않고 안전하게 nil을 반환한다는 뜻입니다.
언래핑 방법은 여러가지가 있고 그 중 하나가 !를 사용하는 것입니다.
하위 멤버에 접근만 할경우는 언래핑은 필요 없습니다. 따라서 !를 줄 이유는 없습니다.
언래핑이 필요한 경우는 만약 self 자체를 어딘가 넘겨줄 때 받는 쪽에서 옵셔널이 아닌 타입이라고 한다면 언래핑을 해서 옵셔널이 아닌 타입으로 넘겨줘야 겠죠.
옵셔널쪽과 클로저쪽 강의에서 설명을 하고 있긴 하지만 처음엔 이해가 쉽게 안될수 있는 부분이긴 합니다.
이해가 잘 안되는 부분은 다시 질문주시면 답변 드리겠습니다.
좀 더 정확하게는 이런느낌으로 만든거라고 보시면 됩니다.