2016-07-27 26 views
0

У меня есть метод, который предназначен для возврата логического значения true, если строковое значение, которое он получает, содержит любую комбинацию символов верхнего или нижнего регистра или дефиса, и возвращает false, если он содержит любые числа или специальные символы (т.е. содержит что-либо за пределами указанного набора символов). У меня есть следующий метод, который, к сожалению, этого не делает:Попытка убедиться, что метод проверяет символы альфа и дефис в Swift

let alphaCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-" 

     if self.isNameValid("joe-bYlow") { 
      print("correct") 
     } //passes 

     if self.isNameValid("YYYYY") { 
      print("correct") 
     } //passes 

     if self.isNameValid("8888ja;sdf") { 
      print ("wrong") 
     } //fails i.e. it prints "wrong" 

     if self.isNameValid("__^&^%%%jdjjd") { 
      print ("wrong") 
     } //fails i.e. it prints "wrong" 

     if self.isNameValid("9999") { 
      print("also wrong") 
     } //passes 

     if self.isNameValid("blahBlah8") { 
      print("wrong") 
     } //fails i.e. it prints "wrong" 

     if self.isNameValid("Frank") { 
      print("correct") 
     } //passes 

    func isNameValid(name: String) -> Bool { 
     let characterSetAllowed = NSCharacterSet(charactersInString: alphaCharacters) 
     if let _ = name.rangeOfCharacterFromSet(characterSetAllowed, options: .CaseInsensitiveSearch) { 
      return true 
     } else { 
      return false 
     } 
    } 

Может ли кто-нибудь увидеть, что это я делаю неправильно?

ответ

1

Ваше решение очень близко к правильному. Логика в вашем методе проверяет, является ли символ ANY символом в альфа-символах.

В случае строки __^&^%%%jdjjd, rangeOfCharacterFromSet возвращает диапазон первого символа, который он находит в наборе. Поэтому он возвращает диапазон {8, 1} для первого j.

Так как мы проверяем на ВСЕ символов в строке? Вы можете перебирать каждого персонажа, но это похоже на большую работу.

Моим решением было бы получить набор символов, который вы не хотите, а затем проверить, что ни один из символов в этом наборе не установлен.

func isNameValid(name: String) -> Bool { 
    let characterSetNotAllowed = NSCharacterSet(charactersInString: alphaCharacters).invertedSet 
    if let _ = name.rangeOfCharacterFromSet(characterSetNotAllowed, options: .CaseInsensitiveSearch) { 
     return false 
    } else { 
     return true 
    } 
} 

Кроме того, спасибо за то, что вы разместили свой код в форме, которую можно легко разместить на игровой площадке, чтобы показать проблему. Это помогло найти причину.

+0

Большое спасибо за ваше время и помощь. Ваше решение сработало! – syedfa