0Pricing
Swift Academy · Pelajaran

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 / UIKit

Lapisan 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 SwiftData

Kasus 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 swappable

Struktur 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 independently

Kesalahan 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

  1. Lapisan: Domain, Data, dan Presentasi
  2. Pola Use Case dan Repositori
  3. Inversi Dependensi dengan Abstraksi Protokol
  4. Menghubungkan Lapisan tanpa Framework DI
← Kembali ke Swift Academy