Я новичок в Swift и пытаюсь разработать калькулятор скорости. Вот мой код:
struct VelocityCalc: View {
@State var velocityNumbers1 : [String] = []
var body: some View {
VStack {
VStack {
Text("Headline")
TextField("e.g., 1, 3, 5, 8,...", text: $velocityNumbers1)
Button {
print("Button works")
} label: {
Text("Tap me")
}
}
}
}
Что я хочу разработать, так это то, что пользователь может ввести, например: 12, 14, 12, 10,... Эти числа должны быть отсортированы и так далее.
Может быть, кто-то может помочь мне с этой проблемой или дать мне несколько советов по этому поводу.
Большое спасибо за вашу помощь :)
Я имею в виду, что массив с числами должен быть отсортирован от 1, 3, 5, 2 до 1, 2, 3, 5
Итак, из пользовательского ввода 1, 3, 5, 8
вы хотите создать массив, содержащий числа 1,3,5,8
? Вы не можете просто передать Array
в TextField
как Binding
и ожидать, что SwiftUI волшебным образом проанализирует ввод как Array
Попробуйте что-то вроде этого,
Получить числа в виде строки
Разделите их с помощью разделителя (')
Преобразуйте их в Int и отсортируйте
struct ContentView: View {
@State var velocityNumber : String = ""
var body: some View {
VStack {
VStack {
Text("Headline")
TextField("e.g., 1, 3, 5, 8,...", text: $velocityNumber)
Button {
let allNumbers = velocityNumber.split(separator: ",").compactMap {
Int($0)
}
print(allNumbers.sorted())
} label: {
Text("Tap me")
}
}
}
}
}
@aleksandar-nesovavic Это то, что вы искали?
Я бы увидел это так:
Сначала я бы взял все числа в виде строки, затем разделил бы строку с помощью разделителя ","
, затем преобразовал бы все строки в массив int и отсортировал
struct VelocityCalc: View {
@State var velocityNumbers1 : String
var body: some View {
VStack {
VStack {
Text("Headline")
TextField("e.g., 1, 3, 5, 8,...", text: $velocityNumbers1)
Button {
let velocityNumbersArray = velocityNumbers1
.components(separatedBy: ",")
.map { Int($0)! }.sorted()
print(velocityNumbersArray)
} label: {
Text("Tap me")
}
}
}
}
}
Я видел ответы, однако я обнаружил, что когда вы вводите числа так, как вы показали нам в своем вопросе, например: 2, 1, 5, 9
с Space
или WhiteSpace
, это не будет работать должным образом, поэтому вот решение для преодоления этой проблемы:
@State var velocityNumbers = ""
func reorderTheArray(velocity: String) -> [String] {
let orderVelocity = velocity.components(separatedBy: ",").compactMap{
Int($0.trimmingCharacters(in: .whitespaces))
}
return orderVelocity.sorted().compactMap {
String($0)
}
}
var body: some View {
VStack {
Text("Headline")
TextField("example", text: self.$velocityNumbers)
Button(action: {
self.velocityNumbers = reorderTheArray(velocity: self.velocityNumbers).joined(separator: ",")
print(self.velocityNumbers)
}) {
Text("Reorder")
}
}
}
Теперь, когда вы нажимаете кнопку Reorder
, все будет переупорядочено непосредственно в вашем текстовом поле.
Я думаю, что имеет смысл вводить одно значение за раз и использовать отдельное поле для отображения введенных значений.
@State var velocityNumbers : [Int] = []
@State var velocity: String = ""
var body: some View {
VStack {
VStack {
Text("Headline")
TextField("velocity", text: $velocity)
Button {
if let value = Int(velocity) {
velocityNumbers.append(value)
velocityNumbers.sort()
}
velocity = ""
} label: {
Text("Add")
}
.keyboardShortcut(.defaultAction)
Divider()
Text(velocityNumbers.map(String.init).joined(separator: ", "))
}
}
}
что вы имеете в виду под сортировкой?