Section 2/151 menit

2. Masalah yang Dipecahkan

2. Masalah yang Dipecahkan

Fitur AI yang Kompleks Tanpa Server

swift
// ❌ TANPA Apple AI Frameworks: kirim gambar ke server untuk OCR
func extractTextFromImage(_ image: UIImage) async throws -> String {
    // Masalah 1: Harus maintain server backend
    // Masalah 2: Biaya API (per 1000 requests)
    // Masalah 3: Latency: upload gambar (500KB-5MB) + inferensi + download
    // Masalah 4: Tidak berfungsi offline
    // Masalah 5: Privasi: gambar dikirim ke server pihak ketiga
    
    let imageData = image.jpegData(compressionQuality: 0.8)!
    let base64 = imageData.base64EncodedString()
    
    var request = URLRequest(url: URL(string: "https://api.ocr-service.com/extract")!)
    request.httpBody = try JSONEncoder().encode(["image": base64])
    
    let (data, _) = try await URLSession.shared.data(for: request)
    return try JSONDecoder().decode(OCRResponse.self, from: data).text
}
swift
// ✓ DENGAN Vision Framework: OCR on-device, privat, offline, gratis
func extractTextFromImage(_ image: UIImage) async -> [String] {
    guard let cgImage = image.cgImage else { return [] }
    
    let request = VNRecognizeTextRequest()
    request.recognitionLevel = .accurate
    request.usesLanguageCorrection = true
    
    let handler = VNImageRequestHandler(cgImage: cgImage)
    try? handler.perform([request])
    
    return request.results?
        .compactMap { $0.topCandidates(1).first?.string } ?? []
}
// On-device, privat, latensi <100ms, tidak butuh internet

Analisis Teks yang Butuh NLP Library Besar

swift
// ❌ TANPA NaturalLanguage: gunakan regex manual untuk entity extraction
func extractEntities(from text: String) -> [String: [String]] {
    // Regex untuk nama orang, lokasi, organisasi — kompleks dan tidak akurat
    // Tidak handle multi-language
    // Tidak ada model ML yang terlatih
    var entities: [String: [String]] = [:]
    // ... 100+ baris regex yang rentan error
    return entities
}
swift
// ✓ DENGAN NaturalLanguage: NER built-in, multi-language
func extractEntities(from text: String) -> [String: [String]] {
    var entities: [String: [String]] = [:]
    let tagger = NLTagger(tagSchemes: [.nameType])
    tagger.string = text
    tagger.enumerateTags(
        in: text.startIndex..<text.endIndex,
        unit: .word,
        scheme: .nameType
    ) { tag, range in
        if let tag {
            let entity = String(text[range])
            entities[tag.rawValue, default: []].append(entity)
        }
        return true
    }
    return entities
}