Section 7/181 menit
7. Parameter Resolution dan Disambiguation
7. Parameter Resolution dan Disambiguation
requestValue: Minta Input dari User
swift
struct AddTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Tambah Tugas"
@Parameter(title: "Judul Tugas")
var title: String
@Parameter(title: "Prioritas", default: .medium)
var priority: PriorityLevel
@Parameter(title: "Tenggat")
var dueDate: Date?
func perform() async throws -> some IntentResult & ProvidesDialog {
// Minta nilai jika parameter belum terisi (misalnya via Shortcuts tanpa parameter)
if title.trimmingCharacters(in: .whitespaces).isEmpty {
title = try await $title.requestValue("Apa judul tugasnya?")
}
let task = try await TaskRepository.shared.create(
title: title,
priority: priority,
dueDate: dueDate
)
return .result(dialog: "Tugas '\(task.title)' berhasil ditambahkan.")
}
}
Disambiguation: Pilih dari Multiple Matches
swift
struct CompleteTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Selesaikan Tugas"
@Parameter(title: "Tugas")
var task: TaskEntity
func perform() async throws -> some IntentResult & ProvidesDialog {
// Skenario: user bilang "Selesaikan tugas meeting" → ada 2 task dengan "meeting"
// Kita bisa lakukan disambiguation manual:
let matchingTasks = try await TaskRepository.shared.search(query: "meeting")
if matchingTasks.count > 1 {
// Tampilkan daftar untuk user pilih
let entities = matchingTasks.map { TaskEntity(task: $0) }
task = try await $task.requestDisambiguation(
among: entities,
dialog: "Tugas 'meeting' mana yang ingin diselesaikan?"
)
} else if let single = matchingTasks.first {
task = TaskEntity(task: single)
}
try await TaskRepository.shared.markCompleted(id: task.id)
return .result(dialog: "Tugas '\(task.title)' sudah selesai!")
}
}
requestConfirmation: Konfirmasi Sebelum Aksi Destruktif
swift
struct DeleteAllCompletedIntent: AppIntent {
static var title: LocalizedStringResource = "Hapus Semua Tugas Selesai"
func perform() async throws -> some IntentResult & ProvidesDialog {
let completedTasks = try await TaskRepository.shared.fetchCompleted()
guard !completedTasks.isEmpty else {
return .result(dialog: "Tidak ada tugas selesai untuk dihapus.")
}
// Minta konfirmasi sebelum hapus
try await requestConfirmation(
result: .result(dialog: "Hapus \(completedTasks.count) tugas selesai?"),
confirmationActionName: .delete
)
// Eksekusi setelah dikonfirmasi
try await TaskRepository.shared.deleteCompleted()
return .result(dialog: "\(completedTasks.count) tugas selesai dihapus.")
}
}