2014-09-26 4 views
1
신속

에서 나는 아래의 선언 :스위프트 : '!'의 차이 및 '?'

@IBOutlet var hw_label : UILabel! 

나는 위와 같이 성공적으로 실행중인 것보다 쓰는 경우,

을하지만 난이 다음과 같이 선언 할 때 :

@IBOutlet var hw_label : UILabel! 

       and 
    hw_label.text = "Hello World" 

그것은 이미지로 오류를 표시합니다. Error Image

나는 단지 '!'의 차이점을 알고 싶습니다. 및 '?'.

또는 왜 이것을 사용해야합니까?

+0

코드 스 니펫 중 하나에'? '를 포함 시키려고 했습니까? 어느 누구도하지 않기 때문에, 지금까지 볼 수 있습니다. –

+0

가능한 복제본 [ "?" 및 "!"] (http://stackoverflow.com/questions/24122601/swift-variable-decorations-with-and) – JJJ

+0

@ 주 : 감사합니다. 나는 찾았지만 어떤 것도 얻지 못해서 내가 물어 보았다 .. –

답변

6

Swift에는 두 가지 유형의 변수가 있습니다.

  1. 옵션 변수
  2. 일반 (비 선택 사항) 변수

옵션 변수 : 가장 짧은 설명이 옵션 변수/객체가 재산 "객체 반환-무풍 때 비를 포함 -있다". objC에서 우리가 만드는 거의 모든 객체는 선택적 변수 일뿐입니다. 즉, 객체에는 "object-returns-nil-when-non-exist"라는 속성이 있습니다. 그러나이 특별한 행동은 항상 필요하지 않습니다. 그래서, 옵션을 식별하기 위해 기호 '?' 및 '!' 사용 되왔다. 다시 선택적 항목의 두 가지 유형이 ...있다

  • 정상 선택적 개체
  • 암시 적으로 풀어 선택적 항목

정상 선택적 항목 (?) (!) :

var normalOptional : String? 

암시 적으로 풀어 선택적 항목 :

var specialOptional : String! 

둘 다 "선택적"동작을하고 있지만 차이점은 '암시 적으로 래핑되지 않은 선택 사항'을 일반 (비 선택적) 값으로 사용할 수도 있습니다.

예를 들어 indexPath 변수는 기본적으로 tableview 대리자 메서드에 의해 (cellForRowAtIndex) 매개 변수 목록에서 선언됩니다. 행 값은 cellForRowAtIndex가 호출 될 때 존재합니다. indexPath 변수는 함수 (cellForRowAtIndex) 매개 변수 목록에 선언되어 있습니다. 그래서 'indexPath'에서 'row'값의 언 래핑은 다음과 같습니다.

 var rowValue = indexPath?.row // variable rowValue inferred as optional Int value 
     or 
     var rowValue = indexPath!.row// variable rowValue inferred as normal Int value 

참고 : '!' unwrapping, 특정 클래스가 존재한다는 것을 확실히 알아야합니다 (값 포함).

희망이 링크는 당신에게 더 많은 아이디어를 줄 것이다. What is the intended use of optional variable/constant in swift

+0

정말 감사합니다. 수레 .. 정말 고맙습니다. –

1

? 옵션 값에 사용됩니다. 즉, 변수를 선언 할 때 변수에 값이 있는지 여부를 알지 못하는 경우 옵션으로 선언합니다. var friendName : String? friendName은 nil 일 수 있습니다.

! 암시 적으로 래핑되지 않은 옵션에 사용됩니다. 즉, 변수에 값이 있어야합니다. var employeeId : String! 당신이 클래스!마르크 변수를 선언하면

,이의 초기화() 메소드에서이 변수의 값을 초기화 할 수 있습니다

0

한 가지 더 무기 호 이 경우 employeeId를 될 수 없습니다 수업.