2016-12-21 25 views
0

爲什麼我的replacementTextHasLetter不會阻止我粘貼到我的文本字段中的字母與下面的條件?UITextFieldDelegate的shouldChangeCharactersIn方法 - 爲什麼不能組合條件語句檢查小數點分隔符和字母

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    let existingTextHasDecimalSeparator = textField.text?.range(of: ".") 
    let replacementTextHasDecimalSeparator = string.range(of: ".") 

    let charactersNotAllowed = NSCharacterSet.letters 
    let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed) 

    if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil && replacementTextHasLetter != nil { 

     return false 

    } 

    return true 

} 

但是,當它有自己獨立的條件它的作品?

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    let existingTextHasDecimalSeparator = textField.text?.range(of: ".") 
    let replacementTextHasDecimalSeparator = string.range(of: ".") 

    let charactersNotAllowed = NSCharacterSet.letters 
    let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed) 

    if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil { 

     return false 

    } 

    if replacementTextHasLetter != nil { 

     return false 

    } 

    return true 

} 

編輯:我想通了。第一個示例不可能工作,因爲existingTextHasDecimalSeparator & replacementTextHasDecimalSeparator基本上是確定文本字段中是否存在小數,並且用戶是否嘗試輸入新的字符以返回false。當我添加

&& replacementTextHasLetter != nil 

到條件,它只是沒有真正服務於一個目的,因爲所有的語句不能同時爲真。謝謝@sonofabeach

+1

把它放在它自己的'if'條件下使它成爲一個「或」('||'),而不是「和」。您正在使用'&&',而不是'||'。你真的想要哪個? –

+0

爲什麼不能成爲「AND」? – tophst

+0

它可以。它可以是任何你想要的。但是不要指望「AND」的表現與「OR」相同。你的問題是(爲了解釋我的理解)......爲什麼你發佈的兩個代碼塊表現不一樣?答案是,其中一個明確地使用「AND」來組合條件('&&'),另一個隱含地等同於使用「OR」來組合條件。 「AND」和「OR」的行爲非常不同。如果答案不夠,那麼你可能需要更多地澄清這個問題。 –

回答

0

這兩條線:

if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil { 
    return false 
} 

if replacementTextHasLetter != nil { 
    return false 
} 

是有效的一樣:

if (existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil) || replacementTextHasLetter != nil { 
    return false 
} 

注意使用||代替&&的最後一個條件。

相關問題