SwiftUI vs UIKit
Appleのモダンな宣言的フレームワークSwiftUIと、実戦で鍛えられたUIKitを徹底比較。2025年、どちらのフレームワークを選ぶべきか?
Appleの安全で高速、モダンな言語
JetBrainsによるモダンで安全、実用的なJVM言語
| カテゴリー | Swift | Kotlin |
|---|---|---|
| パフォーマンス | 10/10 | 8/10 |
| 学習のしやすさ | 7/10 | 8/10 |
| エコシステム | 8/10 | 9/10 |
| コミュニティ | 8/10 | 9/10 |
| 求人市場 | 8/10 | 9/10 |
| 将来性 | 9/10 | 9/10 |
// Swift - モダンな非同期データ読み込み
import Foundation
// Actorによるスレッドセーフなデータマネージャー
actor UserDataManager {
private var cache: [String: User] = [:]
func fetchUser(id: String) async throws -> User {
if let cached = cache[id] {
return cached
}
let url = URL(string: "https://api.example.com/users/\(id)")!
let (data, response) = try await URLSession.shared.data(from: url)
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else {
throw APIError.invalidResponse
}
let user = try JSONDecoder().decode(User.self, from: data)
cache[id] = user
return user
}
}
// 使用例
struct User: Codable {
let id: String
let name: String
let email: String
}
enum APIError: Error {
case invalidResponse
case notFound
}
// SwiftUI View内での利用
@Observable class ProfileViewModel {
var user: User?
var isLoading = false
var errorMessage: String?
private let manager = UserDataManager()
func loadUser(id: String) async {
isLoading = true
defer { isLoading = false }
do {
user = try await manager.fetchUser(id: id)
} catch {
errorMessage = error.localizedDescription
}
}
}// Kotlin - モダンな非同期データ読み込み
import kotlinx.coroutines.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class User(
val id: String,
val name: String,
val email: String
)
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
class UserRepository(private val httpClient: HttpClient) {
private val cache = mutableMapOf<String, User>()
suspend fun fetchUser(id: String): Result<User> {
cache[id]?.let { return Result.Success(it) }
return try {
val user = httpClient.get<User>("https://api.example.com/users/$id")
cache[id] = user
Result.Success(user)
} catch (e: Exception) {
Result.Error(e)
}
}
}
// ViewModel (Android)
class ProfileViewModel(
private val repository: UserRepository
) : ViewModel() {
private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
fun loadUser(id: String) {
viewModelScope.launch {
_uiState.value = UiState.Loading
_uiState.value = when (val result = repository.fetchUser(id)) {
is Result.Success -> UiState.Success(result.data)
is Result.Error -> UiState.Error(result.exception.message ?: "Bilinmeyen hata")
}
}
}
sealed class UiState {
object Loading : UiState()
data class Success(val user: User) : UiState()
data class Error(val message: String) : UiState()
}
}SwiftとKotlinは非常によく似たモダンな言語機能を備えています — どちらもnullセーフティ、コルーチン/async-await、拡張機能、sealed classをサポートしています。言語選択はプラットフォームによって決まります:iOSではSwiftが必須、AndroidではKotlinが標準です。Kotlin Multiplatformは、この2つの世界を統合する興味深い選択肢を提供しています。
無料相談を受ける非常に似ています。どちらも型推論、拡張機能、ラムダ、data/value型、nullセーフティといった特徴を備えています。一方を習得すれば、もう一方の学習ははるかに容易になります。