Исключение с использованием NumberFormatter .spellout в Swift

#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 внутри вашего вычисляемого свойства. Это будет создавать новый форматировщик каждый раз, когда вы вызываете это свойство