Как добавить более одного числа в Binding var

Я новичок в 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,... Эти числа должны быть отсортированы и так далее.

Может быть, кто-то может помочь мне с этой проблемой или дать мне несколько советов по этому поводу.

Большое спасибо за вашу помощь :)

что вы имеете в виду под сортировкой?

Cod3rMax 14.12.2020 14:38

Я имею в виду, что массив с числами должен быть отсортирован от 1, 3, 5, 2 до 1, 2, 3, 5

Neso 14.12.2020 14:40

Итак, из пользовательского ввода 1, 3, 5, 8 вы хотите создать массив, содержащий числа 1,3,5,8? Вы не можете просто передать Array в TextField как Binding и ожидать, что SwiftUI волшебным образом проанализирует ввод как Array

Dávid Pásztor 14.12.2020 14:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
165
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Попробуйте что-то вроде этого,

  1. Получить числа в виде строки

  2. Разделите их с помощью разделителя (')

  3. Преобразуйте их в 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 Это то, что вы искали?

Arun 14.12.2020 14:46

Я бы увидел это так:
Сначала я бы взял все числа в виде строки, затем разделил бы строку с помощью разделителя ",", затем преобразовал бы все строки в массив 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: ", "))
        }
    }
}

Другие вопросы по теме