Я тестирую некоторые строки, такие как один, два, три, семь и т. д., чтобы увидеть, являются ли они числами, используя приведенный ниже код. Это работает нормально, если строка на самом деле является числом, но происходит сбой, когда строка не является числом, как в слове «сбережения».
Весь смысл метода заключается в том, чтобы выяснить, может ли строка быть представлена в виде числа, поэтому я не знаю, как исключить случаи, когда это не так, если это действительно проблема. Я думаю, что это проблема, но я думаю, что я мог что-то упустить, так как я слаб в опционах. Строка, на которой я запускаю это, вызывает ошибку, это слово «сбережения».
Вот мой код:
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
}
}
Исключение гласит:
Fatal error: Unexpectedly found nil while unwrapping an Optional value
В отладчике я могу убедиться, что stringValue является «сбережением».
Спасибо за любые предложения.
попробуй return formatter.number(from: stringValue) ?? 0
объединение предотвращает исключение: return formatter.number(from: stringValue as String) ?? 0 Единственная проблема заключается в том, что 0 вводит в заблуждение, поскольку его можно интерпретировать как ноль, что часто встречается в этом случае использования. Думаю, я застрял с выбором какого-то странного маловероятного числа...
Стандартный подход в Swift будет возвращать необязательный номер. private var number: NSNumber? {
Кстати, вы не должны объявлять средство форматирования чисел внутри вашего вычисляемого свойства. Это будет создавать новый модуль форматирования каждый раз, когда вы вызываете это свойство.
Метод вызывается из файла Objective-c. Я не думаю, что он может обрабатывать опции. Это правильно?
Я ничего не знаю о смешивании obj-c и Swift
Код на самом деле находится в расширении. Где еще тогда, где он может создать экземпляр форматера?
Да, Objective-C может обрабатывать необязательное NSNumber. Он будет возвращен как nil.
вы должны использовать let num = formatter.number(from: stringValue as String) ?? 0 вместо этого кода
Как упомянул Лео Дабус, вы не должны создавать средство форматирования чисел в вычисляемом свойстве. Форматировщики чисел чрезвычайно дороги. Создайте его в другом месте и используйте повторно.





если строковое значение равно «сбережениям», что вы ожидаете, заставляя развернуть результат?