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
}