2016-02-05 29 views
1

我努力學習斯威夫特,它正在變成是從其他語言更多不同的比我預期的...指定文本字段值變量斯威夫特

我只是想存儲用戶輸入的值作爲變量中的整數。

我嘗試導致以下錯誤: 「致命錯誤:意外發現零而展開的可選值」

我曾經嘗試這樣做多種方式,似乎無法拿出一個解決方案,我知道必須有一個簡單的方法來做到這一點。

var intNumber: Int = 0 
@IBOutlet weak var txt_Number: UITextField! 

for view in self.view.subviews as [UIView]{ 
if let txt = view as? UITextField 
{ 
    if let txtData = txt.text where txtData.isEmpty 
    { 
     // Error Message 
    } 
    else 
    { 
     intNumber = Int(txt_Number.text) 
    } 
} 
} 

我知道上面的代碼是不正確的,但我認爲這是最接近正確的我來了。就解包而言,我似乎錯過了一些東西。我理解解包的原理,但我沒有嘗試過編譯,或者如果它編譯的話,當代碼啓動時(按下按鈕時啓動代碼),它會失敗並出現上述錯誤。

感謝您的高級幫助!

回答

1

一對夫婦的想法:

  1. 確保您的插座連接到txt_Number。所有這些代碼檢查,以確保它不是nil是沒有必要的,如果(a)它是你在IB連接的插座; (b)在視圖完全加載之前(即調用viewDidLoad),您沒有執行上述代碼。

    如果插座是不是迷上了,你會看到在左邊距的空白點:

    enter image description here

    如果正確地迷上了,你會看到一個充滿點上左頁邊距:

    enter image description here

  2. 如果一切正常迷上了,你可以做:

    guard let txtData = txt_Number.text, let value = Int(txtData) else { 
        // report error and then `return` 
        return 
    } 
    
    intNumber = value 
    
  3. 如果你想獲得幻想,你可能想確保用戶只能通過

    • 進入數值在viewDidLoad,指定鍵盤僅用於小數。

      txt_Number.keyboardType = .NumberPad 
      

      或者你也可以在IB中指定它。

    • 指定文本字段的委託並僅允許它們輸入數字值。 (這似乎是在在先點冗餘基礎,但它不是,因爲你必須還預計他們將字符串中的文本字段粘貼。)

    https://stackoverflow.com/a/26940387/1271826

+1

更好的告訴他使用'intNumber = Int(txtData)?? 0',所以我們可以防止一個問題關於可選錯誤:)。 – Eendje

+0

@Eendje - 同意。或者使用一個'guard'語句來相應地賦值。 – Rob

0

你試過這個嗎?

if let txtData = txt.text where !txtData.isEmpty 
{ 
    intNumber = Int(txtData) 
} 
else 
{ 
    // Error Message 
} 

ADD

Int()函數返回一個Optional。如果您確信該值是正確的,你可以通過在變量名的末尾(當你使用它)使用!迫使展開,否則只是把問號?

+0

我沒有,我得到以下錯誤:「詮釋」可選類型的值不打開;你的意思是使用'!'要麼 '?'? –

+0

'Int()'函數返回'Optional'。如果你確定這個值是正確的,你可以在變量名的末尾使用'!'強制展開(當你使用它時),否則就把問號'?' –

1

對於初學者來說,你不必如果您有直接引用txt_Number遍歷subviews,但是這不是你的問題的本質。

if let語義將讓你解開裏面{}括號中的任何可選的,因此最明顯的解決方案在這裏是:

if let unwrappedString = txt_Number.text { 
    if let unwrappedIntegerInit = Int(unwrappedString) { 
     intNumber = unwrappedIntegerInit 
    } 
} 

我從操場完整的例子:

var intNumber: Int = 0 
var txt_Number: UITextField = UITextField() 
txt_Number.text = "12" 

if let unwrappedString = txt_Number.text { 
    if let unwrappedIntegerInit = Int(unwrappedString) { 
     intNumber = unwrappedIntegerInit 
    } 
} 

print(intNumber) 

或者你也可以使用保護內功能:

func parse() { 
    guard let text = txt_Number.text, let number = Int(text) else { return } // no text 
    intNumber = number 
} 

提示: 您必須拆開txt_Number.textInt(text)分別導致Int(text)必須具有非自選參數。

0

嘗試下面的代碼到文本字段的值賦給float類型的變量,所有的錯誤消失就像魔術

@IBOutlet weak var txtamount: UITextField! 
@IBOutlet weak var txtrate: UITextField! 
@IBOutlet weak var txtyear: UITextField! 

@IBOutlet weak var lblresult: UILabel! 
@IBAction func btncalculate(_ sender: UIButton) 
{ 
    print("button is clicked") 
    var amount,rate,year,answer : Float 

    amount = Float(txtamount.text!)! 
    rate = Float(txtrate.text!)! 
    year = Float(txtyear.text!)! 

    answer = (amount * rate * year)/100.0 
}