2016-12-21 1 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 

} 

그러나 별도의 조건부가있을 때 작동합니까?

편집 : 알아 냈습니다. 첫 번째 예제가 작동하기 때문에 불가능합니다. existingTextHasDecimalSeparator & replacementTextHasDecimalSeparator은 기본적으로 텍스트 필드에 10 진수가 있는지 여부와 사용자가 새 필드를 입력하려고하면 false를 반환합니다. 나는 조건에

&& replacementTextHasLetter != nil 

을 추가하면 문이 모두 같은 시간에 사실 수 없기 때문에 정말 목적을 제공하지 않습니다. 당신이

+1

'if'조건에 넣으면 "and"가 아닌 "OR"('||')가됩니다. 당신은'||'이 아니라'&&'를 사용하고 있습니다. 너 정말 원하는거야? –

+0

왜 "AND"가 될 수 없습니까? – tophst

+0

수 있습니다. 그것은 당신이 원하는 모든 것이 될 수 있습니다. 그러나 "AND"가 "OR"와 똑같이 행동 할 것으로 기대하지 마십시오. 귀하의 질문은 (내 이해를 의역으로) ... 당신이 게시 한 두 코드 블록이 왜 똑같이 행동하지 않는 이유는 무엇입니까? 대답은 명시 적으로 조건을 결합하기 위해 "AND"를 사용하고 조건을 결합하기 위해 "OR"를 사용하는 것과 암묵적으로 동일하다는 것입니다. "AND"와 "OR"는 매우 다르게 작동합니다. 그 대답이 불충분하다면, 질문을 더 명확히해야 할 수도 있습니다. –

답변

0

이 두 줄을 @sonofabeach 감사합니다

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

주 마지막 조건에 대한 ||의 사용 대신 && :

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

if replacementTextHasLetter != nil { 
    return false 
} 

은과 효과적으로 동일합니다.

관련 문제