Skip to main content

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()
}