#ios #swift
#iOS #swift
Вопрос:
Я пытаюсь получить десятичное число из текстового поля. Это может быть только десятичное число, но если я введу что-то вроде ‘o, 5’, то маркеры будут появляться намного быстрее, чем каждые 0,5 секунды.
Мой код:
@IBAction func enemyBulletDelayClick(_ sender: AnyObject) {
dismissKeyboard()
let correctNumber = enemyBulletDelayText.text?.replacingOccurrences(of: ",", with: ".")
enemyBulletDelay = Double(correctNumber!)!
enemyBulletDelayText.text = ""
}
(Я преобразую каждое ‘,’ в ‘.’ для десятичных чисел.)
В противном случае это выдало бы мне ошибку.
Комментарии:
1. Правильный способ преобразовать введенное пользователем десятичное число в
NSNumber
(затемDouble
) — использоватьNSNumberFormatter
/NumberFormatter
.2. И избегайте всего этого
!
. Они ожидают сбоев, которые должны произойти.
Ответ №1:
Я попытался использовать этот код, и это сработало!
Код:
let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
enemySpawnDelay = (formatter.number(from: enemySpawnDelayText.text!)?.doubleValue)!
Ответ №2:
Если у вас есть? вам нужно развернуть, а не поместить!
Существует множество способов удаления . впоследствии. Выбирайте все, что хотите. Это больше ориентировано на процесс того, что вы делаете, а затем вы можете решить использовать NSNumberFormatter или что вы хотите сделать.
guard let enemyBulletDelayString = enemyBulletDelayText.text? else {
//put whatever you want to do here if this check doesn't pass
return
}
let numberFormatter = NumberFormatter()
formatter.numberStyle = numberFormatter.Style.decimal
if let formattedNumber = numberFormatter.number(from: enemyBulletDelayString) {
enemySpawnDelay = formattedNumber.doubleValue
} else {
numberFormatter.decimalSeparator = ","
if let formattedNumber = numberFormatter.number(from: enemyBulletDelayString) {
enemySpawnDelay = formattedNumber.doubleValue
}
}
Это должно работать с тем, что вы хотите сделать.
Комментарии:
1. Вероятно, нет особых причин использовать оба десятичных разделителя. Пользователь в данной локали будет вводить числа только в их обычном формате. И это поможет, если используется десятичная клавиатура, которая будет отображать только правильный разделитель.
2. Спасибо за помощь, но если я использую это, оно всегда будет выдавать 0.0 вместо числа в текстовом поле.
3. удалите мою переменную var enemyBulletDelay в, я просто поместил ее туда в качестве примера. Похоже, у вас уже есть переменная enemySpawnDelay, поэтому установите для нее значение formattedNumber.doubleValue .
4. Я отредактировал свой код, чтобы задать вашу переменную…. Я видел ваш код выше, который, по вашим словам, работал. Помните о инструкции guard, которую я добавил, чтобы развернуть «enemySpawnDelayText.text» на случай возникновения каких-либо сбоев при доступе к этому тексту. У вас их никогда не должно быть! где угодно (есть менее распространенные случаи, в которых вы определенно можете их использовать, но не делайте этого, пока не поймете их). Вы должны развернуть что-нибудь с помощью ?.