"?"가있는 신속한 변수 장식 (물음표) 및 "!" (느낌표)


106

Swift에서 모든 변수는 값으로 설정되어야하며 선택 사항을 사용하여 nil초기에 설정할 변수를 설정할 수 있음을 이해 합니다.

내가 이해하지 못하는 것은 a로 변수를 설정하는 것이 무엇을 하는가 !하는 것입니다. 왜냐하면 이것이 옵션에서 값을 "언 래핑"한다는 인상을 받았기 때문입니다. 그렇게함으로써 해당 변수에 풀릴 값이 있음을 보장한다고 생각했습니다. 이것이 IBActions에서 사용되는 이유입니다.

간단히 말해, 다음과 같이 할 때 초기화되는 변수는 무엇입니까?

var aShape : CAShapeLayer!

그리고 왜 / 언제 이것을할까요?


이 사실을 확인한 변수가 nil이 아님을 알리기 위해 이렇게합니다 .
Matthias

나는 이것이 중복으로 표시되어야한다고 생각하지 않습니다. "선택 사항은 무엇입니까?" "두 가지 옵션 유형의 차이점은 무엇입니까?"와 같은 질문이 아닙니다. 이것은 질문이 무엇인지에 대한 것입니다
Jiaaro 2014-06-18

이 경우에도 @Jiaaro는 옵션, 암시 적으로 언 래핑 된 옵션 등에 관한 수많은 질문이 있습니다. 다음을 참조 할 수도 있습니다. stackoverflow.com/questions/24272781/…
Jack

@JackWu 좋아, 그러나 나는이 질문이 요청되었을 때 중복되지 않았다고 확신합니다. (예를 들어, 예를 들어 일주일 전 전체 요청)
Jiaaro

@Jiaaro 당신은 좋은 지적을합니다, 나는 이것이 더 오래되었다는 것을 알아 차리지 못했습니다. 아마도 다른 하나는 대신 이것의 복제본으로 표시되어야 할지도 모릅니다 ..
Jack

답변:


145

형식 선언 !에서는 ?. 둘 다 선택 사항이지만 !은 " 암시 적으로 래핑되지 않은"선택 사항입니다 . 즉, 값에 액세스하기 위해 래핑 을 풀지 않아도됩니다 (하지만 여전히 nil 일 수 있음).

이것은 기본적으로 우리가 이미 object-c에서 가졌던 행동입니다. 값 nil 일 있으며 확인해야하지만 선택 사항이 아닌 것처럼 값에 직접 액세스 할 수도 있습니다 (중요한 차이점은 nil을 확인하지 않으면 런타임 오류)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

용법:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}

7
암시 적으로 언 래핑 된 옵션은 The Swift Programming Language의 56 페이지에서 시작하는 적절한 이름의 섹션에 설명되어 있습니다.
Caleb

@Caleb 내가 암시 적으로 언 래핑 옵션을 언급 한 온라인 문서의 관련 섹션에 대한 링크를 추가했습니다. :)
Jiaaro

좋은 정보, 감사합니다. 일반적으로 Swift가 지금까지 우리에게 강요 한 안전을 좋아하면 훨씬 적은 버그가 생성됩니다. :).
Jason Renaldo

@Jiaaro : 공유해 주셔서 감사합니다. 위의 예를 통해 사용자가 완벽하게 이해할 수 있도록합니다. !! :)
ESHA

3
" 이것은 기본적으로 우리가 이미 Objective-c에서 가졌던 행동입니다 "라는 문장 혼란 스러울 수 있다고 생각합니다 . Objective-c에서는 nil값에 액세스 하고 실제로 "작업"할 수 있습니다. 암시 적으로 언 래핑 된 옵 셔널에 신속하게 액세스하면 nil 런타임 예외를 발생시킵니다.
Sascha Wolf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.