#ios #swift #nsnumber #nsnumberformatter #numberformatter
#iOS #swift #nsnumber #nsnumberformatter #numberformatter
Вопрос:
Я тестирую некоторые строки, такие как one, two, three, seven и т.д. чтобы проверить, являются ли они числами, используйте приведенный ниже код. Это работает нормально, если строка на самом деле является числом, но происходит сбой, когда строка не является числом, как в слове «экономия».
Весь смысл метода заключается в том, чтобы выяснить, может ли строка быть представлена в виде числа, поэтому я не знаю, как исключить случаи, когда это не так, — если это действительно проблема. Я думаю, что в этом проблема, но я предполагаю, что я также мог что-то упустить, поскольку я слаб в опциях. Строка, в которой я запускаю это, которая выдает ошибку, — это слово «экономия».
Вот мой код:
public extension NSString {
public var asNum: NSNumber {
// let stringValue = String(value: self)
let stringValue = self
let formatter = NumberFormatter()
formatter.isLenient = true
formatter.numberStyle = .spellOut
let num = formatter.number(from: stringValue as String)!///EXCEPTION
return num
}
}
Исключение гласит:
Неустранимая ошибка: неожиданно обнаружено значение nil при развертывании необязательного значения
В отладчике я могу проверить, что строковое значение равно «savings»
Спасибо за любые предложения.
Комментарии:
1. если строковое значение равно «экономии», чего бы вы ожидали, что произойдет принудительное разворачивание результата?
2. попробуйте
return formatter.number(from: stringValue) ?? 0
3. объединение предотвращает исключение: возвращает formatter.number(из: stringValue в виде строки)?? 0 Единственная проблема в том, что 0 вводит в заблуждение, поскольку его можно интерпретировать как ноль, что часто встречается в этом случае использования. Я думаю, я застрял с выбором какого-то странного маловероятного числа…
4. Стандартным подходом в Swift было бы возвращать необязательное число.
private var number: NSNumber? {
5. Кстати, вы не должны объявлять number formatter внутри вашего вычисляемого свойства. Это будет создавать новый форматировщик каждый раз, когда вы вызываете это свойство