Lapisan: Domain, Data, dan Presentasi
Memisahkan logika bisnis dari akses data dan UI dalam aplikasi Swift.
Lapisan: Domain, Data, dan Presentasi adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.
Arsitektur Bersih dalam Swift
Arsitektur Bersih memisahkan kode ke dalam beberapa lapisan: Ranah (logika bisnis), Data (persistensi/jaringan), dan Presentasi (antarmuka pengguna).
// Domain: pure Swift, no framework imports
// Data: Core Data / URLSession / JSON
// Presentation: SwiftUI / UIKitLapisan Ranah
Lapisan Ranah berisi entitas bisnis, kasus penggunaan, dan protokol repositori. Lapisan ini tidak memiliki dependensi pada UIKit, SwiftUI, atau basis data.
// Domain/Entities/User.swift
struct User {
let id: Int
var name: String
var email: String
}
// No import UIKit, no import SwiftDataKasus Penggunaan dalam Ranah
Kasus penggunaan merangkum satu operasi bisnis tertentu. Kasus ini hanya bergantung pada protokol repositori dari ranah.
// Domain/UseCases/FetchUserUseCase.swift
struct FetchUserUseCase {
let repo: UserRepository
func execute(id: Int) async throws -> User {
try await repo.getUser(id: id)
}
}Protokol Repositori dalam Ranah
Protokol repositori mendefinisikan kontrak akses data. Ranah memiliki protokol tersebut, sedangkan lapisan Data menyediakan implementasinya.
// Domain/Repositories/UserRepository.swift
protocol UserRepository {
func getUser(id: Int) async throws -> User
func saveUser(_ user: User) async throws
}Lapisan Data
Lapisan Data mengimplementasikan protokol ranah menggunakan teknologi konkret (URLSession, Core Data, SwiftData, Keychain).
// Data/Repositories/RemoteUserRepository.swift
struct RemoteUserRepository: UserRepository {
func getUser(id: Int) async throws -> User {
let data = try await URLSession.shared.data(from: userURL(id)).0
return try JSONDecoder().decode(User.self, from: data)
}
func saveUser(_ user: User) async throws { /* PUT request */ }
}Objek Transfer Data
DTO adalah tipe Codable yang digunakan di lapisan Data untuk mendekode respons API, lalu memetakannya ke entitas ranah.
struct UserDTO: Decodable {
var user_id: Int
var full_name: String
func toDomain() -> User { User(id: user_id, name: full_name, email: "") }
}Lapisan Presentasi
Lapisan Presentasi berisi ViewModels dan tampilan SwiftUI. Lapisan ini memanggil kasus penggunaan dan mengekspos status yang dapat diamati.
// Presentation/ViewModels/ProfileViewModel.swift
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var user: User?
private let useCase: FetchUserUseCase
init(useCase: FetchUserUseCase) { self.useCase = useCase }
func load(id: Int) async {
user = try? await useCase.execute(id: id)
}
}Arah Dependensi
Dependensi mengarah ke dalam: Presentasi bergantung pada Ranah; Data bergantung pada Ranah. Ranah tidak bergantung pada apa pun.
// Outer → Inner dependency rule:
Presentation → Domain ← Data
// Domain is the stable core; outer layers are swappableStruktur Direktori
Atur file Swift berdasarkan lapisan, lalu berdasarkan fitur, untuk aplikasi berukuran besar.
// MyApp/
// ├── Domain/
// │ ├── Entities/
// │ ├── UseCases/
// │ └── Repositories/ (protocols)
// ├── Data/
// │ └── Repositories/ (implementations)
// └── Presentation/
// ├── Views/
// └── ViewModels/Manfaat
Arsitektur berlapis memungkinkan pengujian mandiri, implementasi yang dapat ditukar, dan pengembangan tim secara paralel.
// Test Domain in isolation: no network, no DB
// Swap RemoteUserRepo with LocalUserRepo for offline mode
// Teams own layers independentlyKesalahan Umum
Hindari mengimpor UIKit/SwiftUI di lapisan Ranah, dan hindari kebocoran logika bisnis ke dalam tampilan.
// WRONG: Domain entity with SwiftUI Color
struct Product {
var color: Color // UIKit/SwiftUI import in Domain!
}
// CORRECT: Use a plain string or enum
struct Product { var colorHex: String }Pemeriksaan Singkat
Lapisan mana yang memiliki protokol repositori dalam Arsitektur Bersih?
Ringkasan Pelajaran
Lapisan Arsitektur Bersih: Ranah (entitas, kasus penggunaan, kontrak protokol), Data (implementasi jaringan/basis data), Presentasi (antarmuka pengguna + ViewModels). Dependensi mengarah ke dalam, menuju Ranah. Ranah tidak memiliki dependensi kerangka kerja sama sekali, sehingga sepenuhnya dapat diuji dengan pengujian unit.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Lapisan: Domain, Data, dan Presentasi” gratis?
Ya — teks lengkap “Lapisan: Domain, Data, dan Presentasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Lapisan: Domain, Data, dan Presentasi”?
Memisahkan logika bisnis dari akses data dan UI dalam aplikasi Swift. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Swift Academy?
Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Lapisan: Domain, Data, dan Presentasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Lapisan: Domain, Data, dan Presentasi
- Pola Use Case dan Repositori
- Inversi Dependensi dengan Abstraksi Protokol
- Menghubungkan Lapisan tanpa Framework DI