Swift 6 Concurrency vs Kotlin Coroutines Karşılaştırması

Derleme zamanında veri yarışını eleyen aktör tabanlı model

VS
Kotlin Coroutines

Kütüphane tabanlı, esnek suspend-fonksiyon modeli

17 dk okumaiOS

Hızlı Karar

Duruma göre değil, bilinçli bir takas: Swift 6 derleme zamanında daha çok hata yakalar, bedeli yüksek göç maliyetidir. Kotlin coroutines daha esnek ve kademeli benimsenir, paylaşılan state'i runtime disiplinine bırakır. İptalde ise fark yok — ikisinde de kooperatif. Greenfield Apple-only projede Swift 6 dil modunu baştan aç. Eski kod tabanında geçişi target-bazlı planla, en izole modülden başla. KMP'de köprü katmanını ayrı bir mimari faz say.

Swift 6 ConcurrencyKotlin Coroutines
Tam sonucu oku

Puan Karşılaştırması

Grafik yükleniyor...

Detaylı Puanlama

Detaylı Puanlama: Swift 6 Concurrency ve Kotlin Coroutines — kategori bazında 10 üzerinden puanlar
KategoriSwift 6 ConcurrencyKotlin Coroutines
Performans
8/10
8/10
Öğrenme Kolaylığı
5/10
7/10
Ekosistem
7/10
9/10
Topluluk
7/10
8/10
İş Pazarı
8/10
8/10
Gelecek
9/10
8/10

Artıları & Eksileri

Swift 6 Concurrency

Artıları

  • Sendable protokolü, concurrency domain'leri arası geçen her tipi derleme zamanında denetler
  • Actor izolasyonu mailbox mantığıyla tek seferde tek erişim garantisi verir
  • Yapılandırılmış eşzamanlılık: child task parent scope'u aşamaz, hata otomatik iptal yayar
  • Swift 6 dil modu opt-in ve target-bazlı — büyük kod tabanında kademeli geçiş mümkün
  • 4 dil modu (6/5/4.2/4) aynı anda interop edebilir, big-bang göç zorunlu değil
  • Swift 6.3 ile Android artık birinci sınıf hedef (resmi Swift SDK for Android)
  • AsyncSequence, Sequence ile aynı zihinsel modeli async dünyaya taşır

Eksileri

  • Strict concurrency denetimi mevcut kod tabanlarında örtük paylaşılan state'i açığa çıkarır, göç maliyeti yüksek
  • Actor-izolasyon hataları ve Sendable uyarıları büyük projede yüzlerce noktaya yayılabilir
  • Thread Sanitizer'ı gerçek cihazda çalıştıramazsın — Apple dokümanı TSan'i yalnız 64-bit macOS uygulamasında ya da Simulator'da koşan iOS/iPadOS/tvOS/visionOS/watchOS uygulamasında destekliyor
  • Dil-seviyesi actor dışında hafif eşzamanlılık birimi (Kotlin'in dispatcher'ı gibi) sunmuyor
  • Yalnız Apple platformları + yeni Android SDK'da birinci sınıf; JVM/backend tarafında karşılığı yok

En Uygun

Yeni Apple platformu (iOS/macOS/watchOS/visionOS) projeleri, derleme zamanı veri yarışı garantisi istenen ekiplerBüyük ölçekli iOS uygulamalarında kademeli, target-bazlı strict concurrency göçüvisionOS gibi SwiftUI-first platformlarda actor tabanlı state izolasyonuSwift SDK for Android ile deneysel çapraz platform concurrency denemeleri

Kotlin Coroutines

Artıları

  • Suspend fonksiyonlar callback/Future'dan daha güvenli ve az hataya açık soyutlama sağlar
  • coroutineScope() ile yapılandırılmış eşzamanlılık, Job hiyerarşisiyle net ebeveyn-çocuk sorumluluğu
  • Flow, cold/hot (StateFlow/SharedFlow) ayrımıyla zengin bir reaktif-akış API'si sunar
  • IntelliJ IDEA'nın resmi coroutine debug tutorial'ı var (optimized-out değişken sorunu dahil)
  • JVM ekosisteminin tamamında (Android + backend) aynı model çalışır, dil-modu ayrımı yok
  • Kotlin/Native'de Swift/Obj-C ARC entegrasyonu resmi belgelidir — KMP'de iki dünya bir arada
  • 3 katmanlı sürüm ritmi (dil/tooling/bugfix) öngörülebilir güncelleme takvimi verir

Eksileri

  • Veri yarışı denetimi derleyici düzeyinde değil — Mutex/senkronizasyon disiplini geliştiriciye kalır
  • Dil-seviyesinde actor'a eşdeğer birinci sınıf bir yapı yok, en yakını dispatcher+scope deseni
  • İptal kooperatiftir; coroutine kendi suspension point'lerinde kontrol etmezse sızıntı olur
  • GlobalScope.launch gibi yapılandırılmamış kullanım kolayca disiplin dışına çıkabilir
  • Flow'un hot-flow katmanının (StateFlow/SharedFlow) AsyncSequence'te birebir karşılığı yok — KMP köprülemede sürtünme

En Uygun

Kotlin Multiplatform (KMP) projelerinde paylaşılan iş mantığı ve ağ katmanıAndroid uygulamalarında ViewModel/Repository katmanında yapılandırılmış eşzamanlılıkJVM backend servislerinde (Ktor, Spring) yüksek eşzamanlı I/OCallback/Future tabanlı eski koddan kademeli, noktasal suspend-fonksiyon benimsemesi

Kod Karşılaştırması

Swift 6 Concurrency
// Swift 6 — Sendable model + actor ile paralel indirme
import Foundation

struct UserProfile: Sendable, Decodable {
    let id: Int
    let name: String
}

actor ProfileCache {
    private var storage: [Int: UserProfile] = [:]

    func value(for id: Int) -> UserProfile? {
        storage[id]
    }

    func insert(_ profile: UserProfile) {
        storage[profile.id] = profile
    }
}

enum ProfileError: Error {
    case invalidResponse
}

func fetchProfile(id: Int) async throws -> UserProfile {
    let url = URL(string: "https://api.example.com/users/\(id)")!
    let (data, response) = try await URLSession.shared.data(from: url)
    guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
        throw ProfileError.invalidResponse
    }
    return try JSONDecoder().decode(UserProfile.self, from: data)
}

func loadProfiles(ids: [Int], cache: ProfileCache) async throws -> [UserProfile] {
    try await withThrowingTaskGroup(of: UserProfile.self) { group in
        for id in ids {
            group.addTask {
                if let cached = await cache.value(for: id) {
                    return cached
                }
                let profile = try await fetchProfile(id: id)
                await cache.insert(profile)
                return profile
            }
        }
        var results: [UserProfile] = []
        for try await profile in group {
            results.append(profile)
        }
        return results
    }
}
Kotlin Coroutines
// Kotlin Coroutines — yapılandırılmış eşzamanlılık + Mutex ile paralel indirme
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.serialization.Serializable
import io.ktor.client.*
import io.ktor.client.call.body
import io.ktor.client.request.get

@Serializable
data class UserProfile(val id: Int, val name: String)

class ProfileCache {
    private val mutex = Mutex()
    private val storage = mutableMapOf<Int, UserProfile>()

    suspend fun get(id: Int): UserProfile? = mutex.withLock { storage[id] }

    suspend fun put(profile: UserProfile) = mutex.withLock {
        storage[profile.id] = profile
    }
}

suspend fun fetchProfile(client: HttpClient, id: Int): UserProfile =
    client.get("https://api.example.com/users/$id").body()

suspend fun loadProfiles(
    client: HttpClient,
    ids: List<Int>,
    cache: ProfileCache
): List<UserProfile> = coroutineScope {
    ids.map { id ->
        async {
            cache.get(id) ?: fetchProfile(client, id).also { cache.put(it) }
        }
    }.awaitAll()
}

// Cancellation kooperatiftir: uzun süren iş isActive kontrol etmeli
suspend fun loadWithTimeout(client: HttpClient, ids: List<Int>, cache: ProfileCache) =
    withTimeoutOrNull(5_000) { loadProfiles(client, ids, cache) } ?: emptyList()

Sonuç

Duruma göre değil, bilinçli bir takas: Swift 6 derleme zamanında daha çok hata yakalar, bedeli yüksek göç maliyetidir. Kotlin coroutines daha esnek ve kademeli benimsenir, paylaşılan state'i runtime disiplinine bırakır. İptalde ise fark yok — ikisinde de kooperatif. Greenfield Apple-only projede Swift 6 dil modunu baştan aç. Eski kod tabanında geçişi target-bazlı planla, en izole modülden başla. KMP'de köprü katmanını ayrı bir mimari faz say.

Ücretsiz Danışmanlık Al
SSS

Sıkça Sorulan Sorular

Swift 6, Sendable protokolü ve actor izolasyonuyla veri yarışlarını derleme zamanında yakalamayı zorunlu kılar (SE-0302, SE-0306). Kotlin coroutines ise kotlinx.coroutines kütüphanesi üzerinden çalışan bir suspend-function modelidir; veri yarışı denetimi derleyici değil geliştirici disiplinine (Mutex, dispatcher seçimi) bırakılır.

Giriş

Mobil ekiplerin çoğu artık iki eşzamanlılık dünyasında aynı anda yaşıyor: Apple tarafında Swift 6'nın derleme zamanında zorunlu kıldığı strict concurrency, Android/backend tarafında kotlinx.coroutines'in esnek suspend-fonksiyon modeli. Biri "derleyici seni durdursun" diyor, diğeri "esneklik versin, disiplini sen kur" — ama KMP projelerinde artık aynı kod tabanında yan yana çalışıyorlar. Swift 6.3 (24 Mart 2026) Android için resmi Swift SDK getirdi; 15 Eylül 2026'da yayınlanan Swift 6.4 bu temeli ilerletti, kavramsal kırılma olmadan. Kotlin'de 2.4.0 dil sürümü 3 Haziran, 2.4.20 tooling sürümü 7 Eylül 2026'da yayınlandı — son 60 günde iki tarafta da kavramsal değişiklik yok. Yazı yedi kriter üzerinden ilerliyor; en belirleyicileri derleme zamanı denetim, actor vs dispatcher, göç maliyeti ve KMP köprüleme. Kısa cevap: bilinçli bir takas — Swift derleme zamanında daha çok hata yakalar ama göç acısı yüksek; Kotlin esnek ve kademeli benimsenir, bazı yarışları runtime'a bırakır.

Karşılaştırma Matrisi

Karşılaştırma Matrisi: Swift 6 Concurrency / Kotlin Coroutines
ÖzellikSwift 6 ConcurrencyKotlin Coroutines
Veri yarışı denetimiDerleme zamanı (Sendable + actor) (Öne çıkan)Çalışma zamanı disiplini (Mutex, dispatcher)
Yapılandırılmış eşzamanlılıkTaskGroup / async let, dil-seviyesicoroutineScope() + Job hiyerarşisi, kütüphane-seviyesi
İptal modeliKooperatif (Task.isCancelled / checkCancellation) + dil-seviyesi yapısal yayılımKooperatif (isActive / ensureActive) + Job hiyerarşisiyle yayılım
İzolasyon birimiActor (dil-seviyesi, mailbox tabanlı) (Öne çıkan)Dispatcher + Scope (kütüphane deseni)
Akış API'si zenginliğiAsyncSequence (minimal, protokol tabanlı)Flow: cold + hot (StateFlow/SharedFlow) (Öne çıkan)
Göç modeliDil modu, target-bazlı, opt-in (6/5/4.2/4)Kütüphane, noktasal suspend-fonksiyon ekleme (Öne çıkan)
Resmi eşzamanlılık hata ayıklama rehberiXcode TSan dokümanı (cihazda değil, Simulator/macOS) + göç rehberi "Common Compiler Errors"IntelliJ IDEA'ya gömülü coroutine debugger + resmi tutorial (Öne çıkan)
Platform kapsamıApple platformları + Swift 6.3'ten beri Android (SDK)JVM/Android + Kotlin/Native (iOS dahil KMP ile)
LisansApache License 2.0Apache License 2.0
GitHub yıldız (ana dil reposu, 2026-09-24)swiftlang/swift: 70.395★JetBrains/kotlin: 53.450★ (kotlinx.coroutines ayrı: 13.816★)
Güncel sürüm (2026-09-24 itibarıyla)Swift 6.4 (15 Eyl 2026)Kotlin 2.4.20 tooling (7 Eyl 2026)
Resmi vaka/benimseme yazılarıswift.org blog "Adopters" kategorisi (ör. Swift at Apple: TrueType hinting, 12 Haz 2026)kotlinlang.org/case-studies/ özel sayfası (Öne çıkan)
Sürüm süreci öngörülebilirliğiDil modu + minor/major sürümler3 katmanlı: dil (x.0) / tooling (x.20) / bugfix (Öne çıkan)
Sendable/Sıkı tip güvenliği maliyetiYüksek göç maliyeti, ama tek seferlikSürekli disiplin maliyeti (her PR'da)
KMP köprüsü: suspend/Flow'un Swift'e yansımasıKöprü gerekmez — async/await ve AsyncSequence dilin kendi primitifleriSwift export suspend'i async'e, Flow'u AsyncSequence'a çevirir — Kotlin 2.4.0'da Alpha

Derinlemesine İnceleme

Swift 6 Concurrency

Genel Bakış

Swift Concurrency, SE-0296 (async/await), SE-0302 (Sendable), SE-0304 (yapılandırılmış eşzamanlılık) ve SE-0306 (actor) önerileriyle tanıtıldı ve Swift 5.5'te (2021) production'a girdi. Swift 6 dil modu bu temeli zorunlu kılan katman: derleyici artık her değerin Sendable olduğunu statik doğrular ve "concurrent programs are free of data races" garantisi verir (resmi migration guide). Model opt-in ve target-bazlıdır — 4 dil modu (6/5/4.2/4) aynı anda interop edebilir. Actor, mailbox mantığıyla kendi verisini izole eder: aynı anda yalnız tek thread erişir. 24 Mart 2026'da Swift 6.3 ile Android resmi Swift SDK'sı geldi; 15 Eylül 2026'da Swift 6.4 yayınlandı — concurrency modelinde kavramsal değişiklik olmadan tooling ilerlemesi getirdi.

Ekosistem

Paket yöneticisi
Swift Package Manager (SPM)
Geliştirme ortamı
Xcode 27
Popüler kütüphaneler
swift-async-algorithms (Apple resmi)swift-atomics (Apple resmi)The Composable Architectureswift-collections (Apple resmi)
GitHub yıldızı
70,395

Kotlin Coroutines

Genel Bakış

Kotlin Coroutines, JetBrains'in kotlinx.coroutines kütüphanesiyle sunduğu, dile gömülü async/await olmadan suspend fonksiyonlar üzerinden çalışan bir eşzamanlılık modelidir. Yapılandırılmış eşzamanlılık coroutineScope() ve Job hiyerarşisiyle sağlanır; iptal kooperatiftir (coroutine kendi kontrol noktalarında fark eder) ve hiyerarşi boyunca yayılır. Flow API'si asenkron değer dizilerini modelleyip cold flow ile hot flow (StateFlow/SharedFlow) ayrımı sunar — Swift'in AsyncSequence'inde birebir karşılığı olmayan bir katman. Kotlin 2.4.0 dil sürümü 3 Haziran, 2.4.20 tooling sürümü 7 Eylül 2026'da yayınlandı; sürüm notları Swift export'u Alpha'ya yükseltti (suspend→async, Flow→AsyncSequence). Kotlin/Native'in Swift/Obj-C ARC entegrasyonu resmi dokümanla anlatılıyor.

Ekosistem

Paket yöneticisi
Gradle / Maven
Geliştirme ortamı
IntelliJ IDEAAndroid Studio
Popüler kütüphaneler
Ktorkotlinx.coroutineskotlinx.serializationKoin
GitHub yıldızı
53,450

Teknik Analiz

Derleme zamanı veri yarışı denetimi: Sendable vs runtime disiplin

Swift 6'nın en radikal kararı, veri yarışını runtime hatası olmaktan çıkarıp derleme hatasına dönüştürmesi. SE-0302 önerisi Sendable'ı "concurrency domain'leri arası kopyalanarak güvenle taşınmasına izin verilen tipleri modelleyen" bir protokol olarak tanımlıyor. Derleyici, Sendable'a uymayan bir tipi actor sınırları arasında geçirmeyi reddediyor; @Sendable closure'lar da yalnız by-value capture kullanabiliyor. Resmi vaat: Swift 6 modunda derleyici "concurrent programs are free of data races" garantisi verebiliyor. Bedeli var: yıllardır fark edilmeyen paylaşılan mutable state, göç sırasında derleme hatası olarak yüzeye çıkıyor. Kotlin coroutines bu garantiyi hiç vermiyor — bilinçli bir tasarım tercihi. kotlinlang.org resmi rehberi "Shared mutable state and concurrency"yi ayrı başlık olarak ele alıyor: paylaşılan state'in yönetimi derleyicinin değil geliştiricinin sorumluluğunda — Mutex.withLock, immutable veri yapıları veya tek-thread dispatcher gibi disiplinlerle çözülüyor. Sonuç: Swift "önce acı çek, sonra güvende ol"; Kotlin "esnek kal, disiplini sen kur" diyor. Doğru seçim ekip büyüklüğüne bağlı.

Yapılandırılmış eşzamanlılık ve iptal modeli

İki modelin en yakın örtüştüğü kriter. SE-0304 kuralı net: bir child task oluşturan fonksiyon, dönmeden önce onun bitmesini beklemek zorunda ve bir task tek seferde tek fonksiyon çalıştırır — "a single task has no concurrency". Parent hata fırlatırsa awaitlenmemiş child task'lar otomatik iptal edilir. Kotlin'de aynı fikir coroutineScope() ve Job hiyerarşisiyle uygulanır (resmi "Coroutine scope and structured concurrency" bölümü). İptal, resmi dokümana göre coroutine'in kendi kontrol noktalarında fark ettiği kooperatif bir mekanizmadır: askıya alma noktası olmayan CPU-yoğun bir döngü, iptal edilse bile isActive ya da ensureActive() ile kontrol etmedikçe çalışmaya devam eder. Yaygın bir yanılgıyı düzeltelim: Swift'te de iptal kooperatiftir. SE-0304'ün ifadesiyle "cancellation is cooperative: the task will note that it has been cancelled and can choose to return earlier". Task.isCancelled ve try Task.checkCancellation(), isActive/ensureActive() ikilisinin birebir karşılığıdır. Asıl fark fark edişte değil yayılmada: Swift'te yapısal iptal yayılımı dil-seviyesinde zorunlu, Kotlin'de doğru scope seçimine bağlı. İptal kontrolünü unutma hatasını iki tarafta da yapabilirsin.

Aktör vs dispatcher/scope zihinsel modeli

Swift'in actor'ı SE-0306 ile gelen dil-seviyesi birinci sınıf bir yapı: "her actor kendi verisini izole eder, aynı anda yalnız tek thread erişir" ve "mailbox'ındaki mesajları sırayla işler — iki actor-isolated görev asla eşzamanlı çalışmaz". Bu, klasik lock/mutex disiplinini dil seviyesinde otomatikleştiren bir soyutlama. Actor'lar arası geçen tüm referansların Sendable olması da şart — actor modeli Sendable disipliniyle iç içe. Kotlin'de bunun dil-seviyesinde birebir karşılığı yok. En yakın model dispatcher (hangi thread havuzu) + CoroutineScope (yaşam döngüsü) ikilisi — resmi "Coroutine dispatchers" ve "Comparing coroutines and JVM threads" başlıkları bunu anlatıyor. Paylaşılan state'i izole etmek isteyen bir Kotlin geliştiricisi ya tek-thread'li dispatcher'a confine eder ya Mutex kullanır ya da actor-benzeri bir desen kurar — ama hiçbiri dilin kendisinde gömülü değil. Bu fark öğrenme eğrisini de şekillendiriyor: Swift'te "actor" öğrenince izolasyon otomatik gelir; Kotlin'de aynı garantiyi elde etmek için birkaç aracı doğru kombinasyonda kullanmayı öğrenmek gerekir. Coroutine context'in "parental responsibilities" kavramı bu ikili modelin bir parçası.

Akış soyutlaması: AsyncSequence vs Flow

Apple'ın resmi dokümantasyonu AsyncSequence'ı net tanımlıyor: "Sequence'e benzer ve asenkronluk ekler... değerleri await ile alırsınız". AsyncIterator'ın next() metodu async — çağıran taraf bir sonraki değeri await ile bekliyor. Bu, mevcut Sequence/Iterator protokolüne minimal bir ek. Kotlin'in Flow'u daha zengin: resmi dokümana göre bir Flow "asenkron üretilebilen ardışık bir değer akışı". Asıl fark cold/hot ayrımında: dokümanlar açıkça "Cold flows" ve "Hot flows" başlıklarını ayırıyor — StateFlow/SharedFlow gibi hot flow'lar birden fazla collector arasında paylaşılan, sürekli var olan bir durumu temsil ediyor. Cold flow'lar her yeni collector için sıfırdan çalışıyor. AsyncSequence'ın resmi API'sinde bu hot/cold ayrımı dil-düzeyinde adlandırılmış değil — benzer işlevi AsyncStream veya swift-async-algorithms sağlıyor, ama StateFlow'un "her zaman güncel değer tutan, paylaşılan" semantiğinin birebir karşılığı yok. Bu, KMP köprülemede sürtünme kaynaklarından biri: StateFlow'u AsyncSequence'a köprülerken hot-flow davranışını kaybetme riski var, köprü katmanında elle test gerekir.

Mevcut kod tabanının göç maliyeti

Swift 6'nın göç stratejisi kademeli tasarlanmış. Migration guide üç garanti veriyor: dil modu "entirely under your control on a per-target basis", derleyici dört dil modunu aynı anda destekliyor ("6", "5", "4.2", "4") ve farklı modlarla derlenen hedefler birbiriyle interop edebiliyor. Pratikte en izole modülden başlayıp kademeli yayılabilir — "big bang" geçiş zorunlu değil. Dil modu tamamen opt-in: mevcut projeler yapılandırma değiştirmeden strict moda geçmiyor. Kotlin'de "dil modu" kavramı yok çünkü coroutines kütüphane seviyesinde. Suspend fonksiyonlar mevcut callback/Future koduna noktasal eklenebiliyor — resmi rehber bunu "futures/promise'lardan daha güvenli ve az hataya açık" bir soyutlama olarak tanımlıyor, ama benimseme "hepsi ya da hiçbiri" değil. Göç maliyeti daha çok organizasyonel: yapılandırılmış eşzamanlılık disiplinini (GlobalScope.launch'tan kaçınma, doğru scope seçimi) ekip genelinde dayatmak, derleyicinin değil code review'ın işi. Kısacası: Swift'in maliyeti derleyici hatalarıyla ölçülebilir ve somut; Kotlin'inki daha soyut ve disiplin bağımlı — kaçırılan bir GlobalScope.launch production'a kadar fark edilmeyebilir.

Hata ayıklama ve yığın izi kalitesi

Kotlin bu kriterde IDE entegrasyonu üzerinden avantajlı: kotlinlang.org, IntelliJ IDEA için "Debug coroutines using IntelliJ IDEA" tutorial'ı yayınlıyor ve coroutine'lere özgü "Optimized-out variables" sorununu ele alıyor. CoroutineName ile coroutine'leri isimlendirip log çıktısında ayırt etmek de resmi öneri. Swift tarafında resmi rehber yok değil; iş ikiye bölünüyor. Birincisi Xcode'un sanitizer dokümanı: "Thread Sanitizer—The TSan tool detects race conditions between threads" ve aynı sayfaya göre bu araçlar "also support the Swift language". Sınırı da orada yazıyor: TSan'i cihazda çalıştıramazsın, yalnız 64-bit macOS uygulamanda ya da Simulator'da koşan iOS/iPadOS/tvOS/visionOS/watchOS uygulamanda kullanabilirsin. İkincisi Swift 6 göç rehberinin "Common Compiler Errors" bölümü; concurrency hatalarını kök nedenlerine göre gruplayıp "Most of these can be tracked down to a much smaller set of root causes" diyor. Doğru okuma: Kotlin'in üstünlüğü kaynak varlığı değil, debugger'ın doğrudan IDE'ye gömülü olması. Swift'te yük derleme zamanına kaymış; kalan runtime yarışlarını TSan ile avlıyorsun — cihazda koşturamadığın için yarış senaryolarını Simulator'da tekrarlanabilir kıl.

KMP'de iki modelin köprülenmesi

Kotlin/Native, Swift/Objective-C dünyasıyla doğrudan etkileşiyor ve bu resmi belgelenmiş: native-arc-integration.html "Threads", "Deinitializers", "Completion handlers" ve "Retain cycles" başlıklarıyla Kotlin GC'si ile Swift/Obj-C'nin ARC modeli arasındaki entegrasyonu anlatıyor — iki bellek yönetimi felsefesinin aynı runtime'da bir arada çalışması gerekiyor, retain-cycle riski özellikle dikkat istiyor. Swift export tarafında somut ilerleme var: Kotlin 2.4.0 sürüm notlarının "Swift export goes Alpha with improved concurrency support" başlığı, suspend fonksiyonların Swift'in idiomatik async karşılıklarına ve kotlinx.coroutines flow'larının AsyncSequence'a çevrildiğini duyuruyor — coroutine'lerin Swift tarafına yansıması JetBrains'in öncelik listesinde, ama köprü hâlâ Alpha. Pratik kararlar: (1) Kotlin suspend fonksiyonları Swift export yolunda async fonksiyon, klasik Objective-C interop yolunda completion-handler olarak görünür — hangi yolda olduğunu baştan kontrol et. (2) StateFlow'u AsyncSequence'a köprülerken hot-flow semantiğini korumak için ek bir adaptör katmanı gerekir. (3) Retain-cycle riskini azaltmak için resmi ARC entegrasyon rehberini baştan oku.

Hangi Senaryoda Hangisi

Greenfield, Apple-only yeni bir iOS/visionOS uygulaması başlatıyorsun

Öneri: Swift 6 dil modunu baştan aç

Mevcut kod tabanı yükü yok, derleyicinin Sendable/actor denetimini en başından almak göç maliyetini sıfırlar ve uzun vadede veri yarışı sınıfı hataları büyük ölçüde eler.

10+ yıllık, büyük bir UIKit/Objective-C kod tabanın var

Öneri: Swift 6 moduna target-bazlı, kademeli geç — tek seferde tüm projeyi zorlama

Migration guide'ın garantisi gereği 4 dil modu birlikte interop edebiliyor; en izole, en az bağımlılığı olan modülden başlayarak riski dağıtabilirsin.

Android + backend ekibin callback/RxJava tabanlı eski koddan çıkmak istiyor

Öneri: Suspend fonksiyonları noktasal, modül modül ekle

Kotlin coroutines dil değil kütüphane seviyesinde olduğu için 'hepsi ya da hiçbiri' zorunluluğu yok; resmi rehber suspend fonksiyonları futures/promise'lardan daha güvenli bir kademeli-benimseme yolu olarak sunuyor.

KMP ile hem Android hem iOS'u tek Kotlin kod tabanından besliyorsun

Öneri: Köprü katmanını ayrı bir mimari faz olarak planla, state yönetimini (StateFlow) baştan test et

Swift export aktif geliştiriliyor ama StateFlow'un hot-flow semantiği AsyncSequence'a birebir yansımıyor; bu farkı ürün gereksinimleri netleşmeden önce, mimari faz-0'da netleştirmek gerekiyor.

Küçük, disiplinli, rotasyonu düşük bir ekiptesin ve hız öncelikli

Öneri: Kotlin coroutines'in esnekliğinden yararlan (Apple tarafında da mümkünse GCD/Combine yerine async/await tercih et ama strict mode'u zorlama)

Küçük ekiplerde kod inceleme disiplini genelde yeterli; derleyici-zorunlu strict mode'un göç maliyeti, kazandırdığı güvenlikten daha pahalıya gelebilir.

Büyük, rotasyonu yüksek bir kurumsal ekiptesin, code review yükünü azaltmak istiyorsun

Öneri: Swift 6 strict concurrency'ye yatırım yap

Derleyici-zorunlu Sendable denetimi, 'birinin actor sınırını yanlışlıkla ihlal etmesi' riskini insan disiplininden çıkarıp derleyiciye devreder — yeni katılan geliştiricilerin hata yapma alanını daraltır.

Yaygın Tuzaklar

  • Swift 6 moduna geçerken tüm projeyi tek seferde 'strict' yapmaya çalışmak

    Swift 6 Concurrency

    Çözüm

    Target-bazlı, kademeli geçiş yap; migration guide 4 dil modunun (6/5/4.2/4) birlikte interop edebildiğini garanti ediyor — en izole modülden başla.

  • Kotlin'de GlobalScope.launch kullanarak yapılandırılmamış eşzamanlılık yaratmak

    Kotlin Coroutines

    Çözüm

    Her zaman bir CoroutineScope'a (viewModelScope, lifecycleScope veya kendi tanımladığın scope) bağlı coroutineScope()/launch kullan; GlobalScope kullanımını code review'da işaretle.

  • Uzun süren CPU-yoğun bir işte iptal kontrolü eklemeyi unutmak

    Her ikisi

    Çözüm

    İki modelde de iptal kooperatiftir: askıya alma noktası olmayan döngülerde Kotlin'de isActive/ensureActive(), Swift'te Task.isCancelled/try Task.checkCancellation() ile elle kontrol ekle — aksi halde iptal edilmiş iş çalışmaya devam eder.

  • KMP'de Kotlin'in StateFlow'unu Swift'e AsyncSequence olarak köprülerken hot-flow semantiğini kaybetmek

    Her ikisi

    Çözüm

    Köprü katmanında StateFlow'un 'her zaman güncel değer tutan, paylaşılan' davranışının korunduğunu ayrı bir testle doğrula; AsyncSequence'ın resmi API'sinde bu ayrım birebir yok.

  • Swift'te @unchecked Sendable'ı 'derleyici uyarısını susturmak' için gerekçesiz kullanmak

    Swift 6 Concurrency

    Çözüm

    @unchecked Sendable yalnız gerçekten güvenli olduğunu manuel olarak doğruladığın (ör. dahili senkronizasyonu olan bir tip) durumlarda, yorum satırıyla gerekçelendirilerek kullanılmalı — aksi halde derleme-zamanı garantisini boşa çıkarır.

Geçiş Kılavuzu

GCD/Combine tabanlı Swift kodundan Swift 6 strict concurrency'ye, ya da callback/RxJava'dan Kotlin coroutines'e

Tahmini süre: Modül sayısına ve paylaşılan mutable state yoğunluğuna göre değişir; en izole modülden başlayıp target-target ilerlemek süreyi öngörülebilir kılar.
  1. 1Hedef (target/modül) bazında envanter çıkar: hangi dosyalar paylaşılan mutable state, singleton veya delegate kullanıyor?
  2. 2Swift tarafında değer tiplerini (struct/enum) önce Sendable yap — en düşük sürtünmeli, en yüksek etkili ilk adım
  3. 3Kotlin tarafında GlobalScope.launch ve yapılandırılmamış coroutine çağrılarını tara, uygun bir CoroutineScope'a bağla
  4. 4Swift'te sınıf tabanlı paylaşılan state'i actor'a taşı; taşınamayan durumlarda @unchecked Sendable + yazılı gerekçe kullan
  5. 5Kotlin'de Mutex.withLock veya immutable veri yapılarıyla paylaşılan state'i koruma altına al
  6. 6Her iki tarafta da CI'da yeni modüller için strict modu / lint kuralını zorunlu kıl, eski modülleri kademeli dahil et
  7. 7Üçüncü parti bağımlılıkların (SPM paketleri / Gradle kütüphaneleri) uyumluluğunu kontrol et
  8. 8KMP kullanıyorsan köprü katmanını (Swift export / Flow-AsyncSequence adaptörü) ayrı bir modül olarak izole edip test et

Gelecek Öngörüsü

Swift 6 Concurrency

Swift 6.4'ün (15 Eylül 2026) resmi sürüm notlarında öne çıkan başlıklar şunlar: Swift Build artık Swift Package Manager'da varsayılan, WebAssembly köprülemesi JavaScriptKit üzerinden 40 kata kadar hızlandı ve Embedded Swift mikrodenetleyici sınıfı hedeflerde existential tiplerle genişledi. Eşzamanlılık tarafında da hareket var: async defer blokları (SE-0493) ve withTaskCancellationShield (SE-0504) aynı sürümde geldi. Swift 6.3'teki resmi Swift SDK for Android ile birlikte okunduğunda yön net — dil, Apple platformlarının dışına doğru genişlemeye devam ediyor.

Kotlin Coroutines

Kotlin'in 3 katmanlı sürüm ritmi (dil 2.x.0 / tooling 2.x.20 / bugfix) öngörülebilir bir kadans sağlıyor: 2.4.0 dil sürümü 3 Haziran, 2.4.20 tooling sürümü 7 Eylül 2026'da çıktı. 2.4.0 sürüm notlarının Swift export'u Alpha'ya yükseltmesi ve bu sürümde suspend fonksiyonları Swift'in async karşılıklarına, flow'ları AsyncSequence'a çevirmesi, JetBrains'in KMP köprüleme yatırımını sürdürdüğünü gösteriyor — köprü hâlâ Alpha olduğu için üretimde sürüm sabitlemek gerekiyor. Yani Kotlin tarafındaki hareket eşzamanlılık modelinin kendisinde değil, o modelin Swift dünyasına açılan yüzünde.

Altın Bilgi

En değerli çıkarım: "hangisi daha güvenli" yanlış çerçeve. Asıl soru "veri yarışı hatasını ne zaman görmek istiyorsun" — derleme zamanında (Swift) mı, disiplinli inceleme ve testle çalışma zamanında (Kotlin) mı. Küçük, disiplinli ekipte Kotlin'in esnekliği hız kazandırır. Büyük, rotasyonu yüksek ekipte Swift'in derleyici-zorunlu denetimi kod inceleme yükünü azaltır ama geçişi pahalılaştırır. KMP'de ders: iki modeli "aynı şey, farklı sözdizimi" gibi görme. StateFlow'un AsyncSequence'te birebir karşılığı yok; bu farkı köprü katmanında görmezden gelmek, iki platformda farklı davranan "aynı" state akışlarına yol açar. Köprüleme kararını mimari faz-0'da netleştir.

İlgili Blog Yazıları

Tüm Yazıları Gör

İlgili Projeler

Tüm Projeleri Gör

İlgili İçerik