2016-12-20 3 views
0

이것은 필자가 작성한 첫 번째 실제 응용 프로그램이며 선택 사항을 언 래핑하는 동안이 "nil"오류가 발생하는 이유를 알지 못합니다.선택적 값의 래핑 중 "치명적인 오류 nil"디버깅하는 방법?

코드를 게시하기 전에 간단한 지출 계산기를 생각해보십시오.

두 개의 텍스트 필드 (expenseLabel 및 guestLabel)가 있습니다. 응용 프로그램의 시작 부분에 모두 비어 있어야합니다. 여기에 첫 번째 문제가 있습니다. 사용자가 실수로 계산 버튼을 누르면 나는 다음과 같은 오류가 발생합니다 :

unexpectedly found nil while unwrapping an Optional value

은 (그것은 내가 ** ... ** 내에서 아래로 아래에 표시된 코드의 첫 번째 라인이다).

사용자가 숫자를 입력하거나 앱 시작시 라벨이 비어 있지 않은 경우 (예 : 스토리 보드에 숫자를 입력하는 경우) 이는 발생하지 않지만 일부 이상한 이유로 인해 동일한 nil을 얻습니다. resultLabel.text를 업데이트 할 때 두 번째 줄부터 마지막 ​​줄까지 (** ** ** 안에 다시 표시) 오류가 발생합니다. 엑스 코드 마크 다음과 같은 추가 정보와이 라인 :

Thread 1: EXC_BAD_INSTRUCTION (code=EXE_I386_INVOP, subcode=0x0)

이 여기에 코드입니다 :

class ViewController: UIViewController { 


@IBOutlet weak var expenseLabel: UITextField! 
@IBOutlet weak var guestLabel: UITextField! 
@IBOutlet weak var resultLabel: UILabel! 

@IBAction func splitButton(_ sender: Any) { 

    let expense = expenseLabel.text 
    let guests = guestLabel.text 

    **var result = Double(expense!)!/Double(guests!)!** 
    result = round(result * 100)/100 

    **resultLabel.text = String(result)** 
    self.view.endEditing(true) 
} 
... 

그것은 많은 코드가 실제로 아니지만, 나는이 오류가 왜 이해가 안 돼요. 난 다음 시도하고 다른 모든 전에 두 변수의 비용과 손님을 소개 :

expense = Double(expenseLabel.text!) ?? 0.0 
guests = Double(guestLabel.text!) ?? 0.0 

나는이 오류를 언 래핑 전무를 제거하는 데 도움 것이라고 생각하지만,이 역시 작동하지 않았다.

지금은별로 쓸모가 없습니다. 왜냐하면 다시 이것은 많은 코드가 아니며 어떤 이유로 든 전혀 작동하지 않는 것으로 보입니다.

+0

내 조언은 당신이 언어에 익숙해있어 때까지 (일명 '를 사용!'변수 이름 후) 기 해제를 강요하지 마십시오하는 것입니다. 강제로 값을 랩핑하는 것은 당신이 무언가를 해킹하고 올바르게하지 못하는 매우 명백한 신호입니다. 값을 추출하기 위해'if let' 또는'guard'를 사용하십시오. – AdamPro13

답변

1

당신은

  • text 재산 nil가 확인해야?
  • 합니다 (text 속성은 비어 있습니까?)
  • text 속성에있는 문자열은 Double로 변환 할 수 있습니까?

어쨌든 빈 문자열을 Double으로 변환 할 수 없기 때문에 엄격하게이 경우 두 번째 검사를 생략 할 수 있습니다. 스위프트를 배우는 사람에게

if let expense = expenseLabel.text, // !expense.isEmpty, 
    let expenseValue = Double(expense), 
    let guests = guestLabel.text, // !guests.isEmpty, 
    let guestValue = Double(guests) { 

    let result = round((expenseValue/guestValue) * 100)/100 
    resultLabel.text = String(result) 
} else { 
    resultLabel.text = "Something went wrong" 
} 
+0

감사! 그것은 많은 도움이되었습니다! – RjC

+0

어쩌면 하나의 문장으로 let let statement가 어떻게 작동하는지 설명해 주시겠습니까? 나는 그것을 이해하려고 노력하고 내 자신을 만들려고 노력하지만, 어떤 이유로 나는 나의 것과 같이 일하지 않았다. – RjC

+0

'let let'은 오른쪽 표현식의 값을 다음 변수에 할당합니다. 그렇지 않으면 연관된'{...} '코드를 건너 뜁니다. 이것은 매우 기본적인 Swift 자료입니다. – vadian