2015-10-10 5 views
1

Перед Swift 2 я использовал это расширение, чтобы проверить, является ли строка только сделана из чисел:Как проверить, содержит ли строка только числа в Swift 2?

func isNumbersOnly() -> Bool { 
     let regexNumbersOnly = NSRegularExpression(pattern: ".*[^0-9].*", options: nil, error: nil)! 
     return regexNumbersOnly.firstMatchInString(self, options: nil, range: NSMakeRange(0, self.length())) != nil 
} 

, но теперь с Swift 2 я получаю ошибку

Cannot invoke initializer for type 'NSRegularExpression' with an argument list of type '(pattern: String, options: NilLiteralConvertible, error: NilLiteralConvertible)'

Есть ли более известный способ Теперь? Thnx!

ответ

2

В Swift 2 NSRegularExpression «бросает», поэтому вы должны использовать его с try.

Также вы не можете пройти nil для вариантов: если вы не хотите указывать параметры, передайте пустой массив (тот же для firstMatchInString).

И self.length() должно стать self.characters.count.

Последнее примечание: если цель состоит в том, чтобы определить, содержит ли строка только числа, и поскольку вы называете ее «isNumbersOnly», результирующее значение Boolean должно быть истинным, если есть только числа: в настоящее время это инверсия. Я исправил это в моем примере.

Игнорирование ошибки:

let regexNumbersOnly = try! NSRegularExpression(pattern: ".*[^0-9].*", options: []) 
return regexNumbersOnly.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) == nil 

При правильной обработке ошибок:

do { 
    let regexNumbersOnly = try NSRegularExpression(pattern: ".*[^0-9].*", options: []) 
    return regexNumbersOnly.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) == nil 
} catch let error as NSError { 
    print(error.description) 
} 
+0

круто, tnx! так много изменений ... – headkit

+0

Добро пожаловать. В самом деле. – Moritz

1

Swift 2 отрегулировал обработку ошибок; вы должны теперь позвонить try, не указывая error и будьте готовы поймать исключение.

E.g.

do { 
    let regexNumbersOnly = try NSRegularExpression(pattern: ..., options: nil) 
    ... etc ... 
} catch _ {} 

... учитывая, что вы выбираете не обрабатывать состояния ошибок.

+0

один случай, когда 'try!', Вероятно, предпочтительнее. – Sulthan

+0

Хорошо, я тоже относительно новичок в синтаксисе, я в основном хотел передать политическую причину изменения в 'init' и вашу потребность попробовать/поймать. Я буду отмечать как вики сообщества, чтобы улучшить код. – Tommy

+1

В принципе, если вы не хотите поймать ошибку (вы используете '_'), вам не нужно' do {try ...} catch {} ', вы можете написать просто' let regex = try! ... '. Я думаю, что это предпочтительнее в этом случае, потому что вы не зависите от каких-либо внешних переменных, и регулярное выражение init всегда должно быть успешным. – Sulthan

1

Вместо использования регулярных выражений, вы можете использовать CharacterSet с, чтобы проверить наличие (или отсутствие) определенных символов. Чтобы проверить, является ли строка только цифры вы можете использовать следующее:

extension String { 
    var isDigits: Bool { 
     if isEmpty { return false } 
     // The inverted set of .decimalDigits is every character minus digits 
     let nonDigits = CharacterSet.decimalDigits.inverted 
     return rangeOfCharacter(from: nonDigits) == nil 
    } 
} 

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

+0

Это вернет true для пустой строки – Leon

+0

@Leon благодарит за это. Я обновил код примера. –

Смежные вопросы