Intelligentes Menü mit Vorhersage
Beschreibung
Diese View bietet ein intelligentes Suchmenü mit Autovervollständigung basierend auf individuellen Nutzergewohnheiten. Während der Eingabe werden häufig gewählte Optionen priorisiert angezeigt, sodass bevorzugte Einträge schneller auffindbar sind. Das System lernt fortlaufend durch vorherige Auswahlen.
🔍 Zweck
- Schnellere Auswahl von Lieblingsgerichten in Food-Apps
- Effizientes Finden und Auswählen regelmäßig verwendeter Kontakte oder Orte
- Personalisierte Suche für Produktkataloge oder Dienstleistungen
- Bessere Nutzerfreundlichkeit bei häufig genutzten Interaktionsmenüs
- Unterstützung von Chatbots mit adaptiven Vorschlägen
🖥️ Betriebssystem
iOS
📄 Codebeispiel
import SwiftUI
struct PredictiveMenuView: View {
@State private var searchTerm = ""
// Example menu items (could be dynamic or from backend)
let allItems = [
"Pizza", "Pasta", "Salat", "Burger", "Sushi", "Currywurst",
"Falafel", "Pommes", "Steak", "Tacos", "Reis", "Paella"
]
// Simulated local frequency tracking (in-memory only for demo)
@AppStorage("menuFrequencies") private var encodedFrequencies = ""
@State private var frequencies = [String:Int]()
@State private var selectedItem = ""
var filteredItems: [String] {
// Filter matching search term and sort by frequency descending, then alphabetically.
let filtered = allItems.filter { searchTerm.isEmpty || $0.localizedCaseInsensitiveContains(searchTerm) }
return filtered.sorted { lhs, rhs in
(frequencies[lhs] ?? 0) == (frequencies[rhs] ?? 0)
? lhs < rhs // Alphabetical fallback if equal frequency
: (frequencies[lhs] ?? 0) > (frequencies[rhs] ?? 0)
}
}
var body: some View {
VStack(alignment: .leading, spacing: 16) {
Text("Was möchtest du essen?")
.font(.headline)
TextField("Suche...", text: $searchTerm)
.textFieldStyle(RoundedBorderTextFieldStyle())
List(filteredItems, id: \.self) { item in
Button(action: {
select(item)
}) {
HStack {
Text(item)
if frequencies[item, default: 0] > 0 {
Spacer()
Text("⭐️ \(frequencies[item]!)")
.font(.caption2)
.foregroundColor(.yellow)
}
}
}
}
if !selectedItem.isEmpty {
Text("Ausgewählt: \(selectedItem)")
.fontWeight(.medium)
.padding(.top)
.transition(.opacity.combined(with:.slide))
}
Spacer()
}
.padding()
.onAppear(perform: loadFrequencyData)
.onChange(of: frequencies) { saveFrequencyData() }
.animation(.easeInOut(duration: 0.18), value:selectedItem)
}
// Select an item and update frequency data.
private func select(_ item:String) {
selectedItem = item
frequencies[item, default: 0] += 1
// Reset search after selection for better UX.
searchTerm = ""
}
// Simple persistence using AppStorage and JSON.
private func saveFrequencyData() {
if let data = try? JSONEncoder().encode(frequencies),
let str = String(data:data, encoding:.utf8) {
encodedFrequencies = str
}
}
private func loadFrequencyData() {
guard !encodedFrequencies.isEmpty,
let data = encodedFrequencies.data(using:.utf8),
let decoded = try? JSONDecoder().decode([String:Int].self, from:data) else { return }
frequencies = decoded
}
}
#Preview {
PredictiveMenuView()
}