#ios #swift #random #swiftui
#iOS #swift #Случайный #swiftui
Вопрос:
По сути, то, что я пытаюсь сделать, это создать случайное число в диапазоне от 0,001 до 0,999, взять это число и умножить на сублоттоны (в настоящее время просто установлено значение 1000,0) и добавить это число к одному другому числу (все равно нужно добавить этот бит кода) для конечного результата.
Проблема, которую я замечаю при вызове чисел для отображения на экране, заключается в том, что мое случайное число покажет одно, но математика не работает.
Например, на моем экране в настоящее время указано, что мое случайное число равно .943. 1000 * .943 должно равняться 943 для моего случайного образца тоннажа, вместо этого он сообщает мне, что оно равно 525.
Может ли быть так, что мой код дважды вызывает переменную randomNumber?
Спасибо за помощь!
var randomNumber: Double {
let ranNum = Double.random(in: 0.001..<1)
return ranNum
}
let sublotTons = 1000.0
var randomTons: Double {
sublotTons * randomNumber
}
var body: some View {
// Display Random Number
VStack {
Text("Random Number: (randomNumber, specifier: "%.3f")")
Text("Sublot Tons = 1000")
Text("Random Sample Tonnage: (randomTons, specifier: "%.0f")")
}
}
}
Комментарии:
1. Не связано с вашим вопросом, но если вы намерены исключить ноль из результатов, вы можете использовать
FloatingPoint
свойствоnextUp
. И, кстати, Swift — это язык, основанный на выводе типа. Вы можете опуститьDouble
префикс.var randomNumber: Double { .random(in: 0.nextUp ..< 1) }
Ответ №1:
Да, randomNumber
вызывается дважды.
Поскольку randomNumber
это вычисляемое свойство, при каждом вызове randomTons
оно будет возвращать новое случайное значение.
Итак, если вы намерены использовать то же значение, я предлагаю сохранить randomNumber
и создать randomTons
функцию, которая получает это сохраненное значение:
var randomNumber: Double {
let ranNum = Double.random(in: 0.001..<1)
return ranNum
}
let sublotTons = 1000.0
func randomTons(_ number: Double) -> Double {
sublotTons * number
}
var body: some View {
// Display Random Number
VStack {
let storedRandomNumber = randomNumber
Text("Random Number: (storedRandomNumber, specifier: "%.3f")")
Text("Sublot Tons = 1000")
Text("Random Sample Tonnage: (randomTons(storedRandomNumber), specifier: "%.0f")")
}
}
Ответ №2:
Вы вызываете его дважды: один раз здесь:
Text("Random Number: (randomNumber, specifier: "%.3f")")
и затем, при вычислении случайных чисел здесь:
Text("Random Sample Tonnage: (randomTons, specifier: "%.0f")")
Комментарии:
1. Да, и, возможно, стоит упомянуть, что оба
randomNumber
иrandomTons
являются так называемыми вычисляемыми свойствами, и прикрепленный к ним код выполняется при каждом обращении к ним. Лично я бы пропустил первое свойство и переместил этот код во второе.
Ответ №3:
Вы можете использовать что-то вроде этого
var randomNumber: Double = {
let ranNum = Double.random(in: 0.001..<1)
return ranNum
}()
для того, чтобы randomNumber вычислялся и сохранялся один раз при запуске и использовался позже в нужных вам местах. У вас уже есть это значение, не нужно создавать еще одну переменную, чтобы сохранить ее снова.