0Pricing
Kotlin Academy · Ders

Platform API'leri için expect/actual Mekanizması

Ortak kodda beklenen bildirimleri tanımlayın ve her platform için actual uygulamalar sağlayın.

Platform API'leri için expect/actual Mekanizması, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

expect/actual Deseni

expect, commonMain içinde bir API sözleşmesi bildirir. Her platform bir actual uygulaması sağlar. Derleyici, tüm hedeflerde bir actual bulunmasını zorunlu kılar.

// commonMain:
expect fun platformName(): String

// androidMain:
actual fun platformName(): String = "Android ${android.os.Build.VERSION.SDK_INT}"

// iosMain:
actual fun platformName(): String = UIDevice.currentDevice.systemName()

expect class

expect class, API'siyle birlikte bir sınıfı commonMain'de bildirir. Her platform tam uygulamayı sağlar.

// commonMain:
expect class DateTime {
    fun format(pattern: String): String
    val timestamp: Long
}

// androidMain:
actual class DateTime {
    actual val timestamp = System.currentTimeMillis()
    actual fun format(pattern: String): String =
        java.text.SimpleDateFormat(pattern).format(java.util.Date(timestamp))
}

expect object

expect object, sözleşmesiyle birlikte tekil bir nesne bildirir. Günlük kaydı, ayarlar veya analizler gibi platforma özgü yardımcılar için kullanışlıdır.

// commonMain:
expect object Logger {
    fun debug(msg: String)
    fun error(msg: String, cause: Throwable? = null)
}

// androidMain:
actual object Logger {
    actual fun debug(msg: String) = android.util.Log.d("App", msg)
    actual fun error(msg: String, cause: Throwable?) =
        android.util.Log.e("App", msg, cause)
}

Üst Düzeyde expect val / fun

Üst düzey expect val ve expect fun, durum tutmayan platform yardımcıları için basittir ve iyi çalışır.

// commonMain:
expect val isDebugBuild: Boolean
expect fun generateUUID(): String

// androidMain:
actual val isDebugBuild: Boolean = BuildConfig.DEBUG
actual fun generateUUID(): String = java.util.UUID.randomUUID().toString()

// iosMain:
actual val isDebugBuild: Boolean = false // or a native flag
actual fun generateUUID(): String = NSUUID().UUIDString()

Varsayılan Uygulamalı expect fun

Kotlin 1.9 ve sonraki sürümlerde expect fun, expect fun f() { } aracılığıyla varsayılan bir uygulamaya sahip olabilir. Platformlar bunu geçersiz kılabilir veya varsayılanı kullanabilir.

// commonMain (Kotlin 1.9+):
expect fun log(msg: String) {
    println("[DEFAULT] $msg") // used if no actual overrides
}

// androidMain:
actual fun log(msg: String) = android.util.Log.d("KMP", msg)

// iosMain (uses default):
// no actual needed — default is used

Gerçek Tür Takma Adı

Bir platformda ihtiyacınız olan sınıf zaten varsa, onu sarmalamak yerine göstermek için actual typealias kullanın.

// commonMain:
expect class AtomicInt {
    fun get(): Int
    fun incrementAndGet(): Int
}

// androidMain / jvmMain:
actual typealias AtomicInt = java.util.concurrent.atomic.AtomicInteger

// iosMain:
actual class AtomicInt {
    private var value = 0
    actual fun get() = value
    actual fun incrementAndGet() = ++value
}

expect interface (Dolaylı Desen)

Daha fazla esneklik için commonMain'de bir arayüz bildirin ve expect/actual yapısını yalnızca platform örneğini oluşturan fabrika için kullanın.

// commonMain:
interface FileStorage {
    suspend fun readFile(path: String): ByteArray
    suspend fun writeFile(path: String, data: ByteArray)
}
expect fun createFileStorage(): FileStorage

// androidMain:
actual fun createFileStorage(): FileStorage = AndroidFileStorage()

// iosMain:
actual fun createFileStorage(): FileStorage = IosFileStorage()

expect/actual ile Test Etme

commonTest içinde ortak API'yi test edin. Gerçek uygulamalar platforma özgü test görevleri sırasında çalışır (Android'de testDebugUnitTest, iOS'ta iosX64Test).

// commonTest:
import kotlin.test.Test
import kotlin.test.assertNotNull
class PlatformTest {
    @Test
    fun testUUID() {
        val uuid = generateUUID()
        assertNotNull(uuid)
        println("UUID: $uuid")
    }
}

Yaygın Tuzaklar

Bildirilen her expect için yapılandırılmış TÜM hedeflerde bir actual bulunmalıdır; aksi hâlde derleme başarısız olur. Eksik actual uygulamaları derleme zamanında yakalanır.

// If you add a new target (e.g., jvmMain), you must add:
// actual fun platformName(): String = "JVM"
// Otherwise:
// error: Expected function platformName has no actual declaration in module :shared for JVM
fun main() { println("Missing actuals = compile error") }

Expect Açıklama Sınıfı

expect annotation class, platforma özgü açıklama eşlemesine olanak tanır; örneğin ortak bir @Parcelize benzeri açıklamayı Android Parcelize eklentisine eşlemek için kullanılabilir.

// commonMain:
expect annotation class CommonParcelize()

// androidMain:
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
actual annotation class CommonParcelize

// iosMain:
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
actual annotation class CommonParcelize

Gerçek Dünya: Anahtar Zinciri ve Tercihler

Gerçek dünyadaki tipik bir expect/actual örneği, Android'in EncryptedSharedPreferences, iOS'un ise Anahtar Zinciri kullandığı güvenli depolama arayüzüdür.

// commonMain:
expect class SecureStorage {
    fun save(key: String, value: String)
    fun get(key: String): String?
}

// androidMain:
actual class SecureStorage {
    private val prefs = /* EncryptedSharedPreferences */ mapOf<String,String>()
    actual fun save(key: String, value: String) { /* ... */ }
    actual fun get(key: String): String? = null // simplified
}

Hızlı Kontrol

Bir expect bildiriminin bir hedef için actual uygulaması yoksa derleme zamanında ne olur?

Özet

expect, API'yi commonMain'de bildirir. actual, platform uygulamasını sağlar. Platformda gerekli tür zaten varsa actual typealias kullanın. Eksik actual uygulamaları derleme zamanında yakalanır; çalışma zamanında sürpriz yaşanmaz.

Sıkça Sorulan Sorular

“Platform API'leri için expect/actual Mekanizması” dersi ücretsiz mi?

Evet — “Platform API'leri için expect/actual Mekanizması” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Platform API'leri için expect/actual Mekanizması” dersinde ne öğreneceğim?

Ortak kodda beklenen bildirimleri tanımlayın ve her platform için actual uygulamalar sağlayın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Platform API'leri için expect/actual Mekanizması” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. KMP Proje Yapısı: commonMain, androidMain, iosMain
  2. Platform API'leri için expect/actual Mekanizması
  3. Repository ve Use Case Katmanlarını Paylaşma
  4. KMP'de Koin ile Bağımlılık Enjeksiyonu
← Kotlin Academy Sayfasına Dön