Swift ile iOS Uygulama Geliştirme Temelleri
Swift Programlama Diline Giriş
Swift, Apple tarafından 2014 yılında tanıtılan modern, güvenli ve yüksek performanslı bir programlama dilidir. Objective-C'nin yerini almak üzere tasarlanan Swift, iOS, macOS, watchOS ve tvOS uygulamaları geliştirmek için kullanılan birincil dildir. Tip güvenliği, bellek yönetimi ve okunabilir söz dizimi gibi özellikleriyle hem yeni başlayanlar hem de deneyimli geliştiriciler için ideal bir tercihtir.
Swift'in en önemli avantajlarından biri, tip güvenliği (type safety) sağlamasıdır. Bu sayede derleme aşamasında birçok hata yakalanır ve çalışma zamanı hatalarının önüne geçilir. Ayrıca Automatic Reference Counting (ARC) ile bellek yönetimi otomatik olarak gerçekleştirilir.
Geliştirme Ortamının Hazırlanması
iOS uygulama geliştirmeye başlamak için aşağıdaki araçlara ihtiyacınız vardır:
- Mac bilgisayar: macOS işletim sistemi zorunludur.
- Xcode: Apple'ın resmi IDE'si (Entegre Geliştirme Ortamı). App Store'dan ücretsiz indirilebilir.
- Apple Developer hesabı: Uygulamalarınızı fiziksel cihazda test etmek ve App Store'a yüklemek için gereklidir.
Xcode içerisinde Interface Builder, Simulator, Instruments ve Swift Playgrounds gibi güçlü araçlar bulunur. Yeni bir proje oluştururken genellikle "App" şablonunu seçerek başlarsınız.
Swift Temel Söz Dizimi
Değişkenler ve Sabitler
Swift'te değişkenler var, sabitler ise let anahtar kelimesiyle tanımlanır. Apple, mümkün olan her yerde let kullanmayı önerir çünkü bu, kodunuzu daha güvenli ve okunabilir kılar.
let uygulamaAdi: String = "İlk Uygulamam"
var kullaniciSayisi: Int = 0
var aktifMi: Bool = true
let pi: Double = 3.14159
// Tip çıkarımı (type inference) sayesinde tip belirtmek zorunlu değildir
let sehir = "İstanbul" // Swift bunu String olarak algılar
var sicaklik = 25 // Swift bunu Int olarak algılar
Opsiyoneller (Optionals)
Swift'in en güçlü özelliklerinden biri opsiyonellerdir. Bir değişkenin değer içerebileceğini veya nil (boş) olabileceğini belirtir. Bu, null pointer hatalarını önlemenin en etkili yoludur.
var kullaniciAdi: String? = nil
// Güvenli açma (optional binding)
if let isim = kullaniciAdi {
print("Hoş geldin, \(isim)")
} else {
print("Kullanıcı adı belirtilmemiş")
}
// Guard let ile erken çıkış
func selamla(isim: String?) {
guard let isim = isim else {
print("İsim bulunamadı")
return
}
print("Merhaba, \(isim)!")
}
Koleksiyonlar
Swift üç temel koleksiyon tipi sunar:
// Dizi (Array)
var meyveler: [String] = ["Elma", "Armut", "Portakal"]
meyveler.append("Muz")
// Sözlük (Dictionary)
var ogrenciNotlari: [String: Int] = [
"Ahmet": 85,
"Ayşe": 92,
"Mehmet": 78
]
// Küme (Set)
var benzersizSayilar: Set<Int> = [1, 2, 3, 4, 5]
UIKit ile Arayüz Geliştirme
UIKit, iOS uygulamalarında kullanıcı arayüzü oluşturmak için kullanılan temel framework'tür. Her ekran bir UIViewController tarafından yönetilir ve arayüz elemanları programatik olarak veya Storyboard üzerinden oluşturulabilir.
import UIKit
class AnaSayfaViewController: UIViewController {
let baslikLabel = UILabel()
let girisButton = UIButton(type: .system)
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
arayuzuOlustur()
}
func arayuzuOlustur() {
baslikLabel.text = "Uygulamama Hoş Geldiniz"
baslikLabel.font = UIFont.boldSystemFont(ofSize: 24)
baslikLabel.textAlignment = .center
baslikLabel.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(baslikLabel)
girisButton.setTitle("Giriş Yap", for: .normal)
girisButton.addTarget(self, action: #selector(girisYapTapped), for: .touchUpInside)
girisButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(girisButton)
NSLayoutConstraint.activate([
baslikLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
baslikLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -50),
girisButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
girisButton.topAnchor.constraint(equalTo: baslikLabel.bottomAnchor, constant: 30)
])
}
@objc func girisYapTapped() {
print("Giriş butonuna tıklandı")
}
}
SwiftUI: Modern Arayüz Geliştirme
2019'da tanıtılan SwiftUI, deklaratif bir yaklaşımla arayüz geliştirmeyi mümkün kılar. UIKit'e kıyasla çok daha az kodla güçlü arayüzler oluşturabilirsiniz. Yeni projeler için Apple, SwiftUI kullanmayı önermektedir.
import SwiftUI
struct AnaSayfaView: View {
@State private var sayac: Int = 0
@State private var isimGirdisi: String = ""
var body: some View {
NavigationView {
VStack(spacing: 20) {
Text("Sayaç: \(sayac)")
.font(.largeTitle)
.fontWeight(.bold)
HStack(spacing: 15) {
Button("Azalt") {
sayac -= 1
}
.buttonStyle(.bordered)
Button("Artır") {
sayac += 1
}
.buttonStyle(.borderedProminent)
}
TextField("Adınızı girin", text: $isimGirdisi)
.textFieldStyle(.roundedBorder)
.padding(.horizontal, 40)
if !isimGirdisi.isEmpty {
Text("Merhaba, \(isimGirdisi)!")
.foregroundColor(.green)
}
}
.navigationTitle("İlk Uygulamam")
}
}
}
SwiftUI'da @State özelliği, görünümün durumunu yönetir. Durum değiştiğinde SwiftUI arayüzü otomatik olarak günceller. Bu, reaktif programlama modelinin temelidir.
Veri Yönetimi ve Kalıcılık
UserDefaults
Küçük boyutlu verileri (ayarlar, tercihler) saklamak için UserDefaults kullanılır:
// Veri kaydetme
UserDefaults.standard.set("Fatih", forKey: "kullaniciAdi")
UserDefaults.standard.set(true, forKey: "karanlikMod")
// Veri okuma
let isim = UserDefaults.standard.string(forKey: "kullaniciAdi") ?? "Misafir"
let karanlikMod = UserDefaults.standard.bool(forKey: "karanlikMod")
Codable Protokolü ile JSON İşleme
API'lerden gelen verileri işlemek için Codable protokolü kullanılır:
struct Kullanici: Codable {
let id: Int
let isim: String
let email: String
}
// JSON'dan nesneye dönüştürme
let jsonVeri = """
{"id": 1, "isim": "Ahmet", "email": "ahmet@ornek.com"}
""".data(using: .utf8)!
let kullanici = try JSONDecoder().decode(Kullanici.self, from: jsonVeri)
print(kullanici.isim) // "Ahmet"
Ağ İstekleri (Networking)
iOS'ta ağ istekleri için URLSession kullanılır. Modern Swift'te async/await söz dizimi bu işlemi çok daha okunabilir hale getirir:
func kullanicilariGetir() async throws -> [Kullanici] {
let url = URL(string: "https://api.ornek.com/kullanicilar")!
let (veri, yanit) = try await URLSession.shared.data(from: url)
guard let httpYanit = yanit as? HTTPURLResponse,
httpYanit.statusCode == 200 else {
throw URLError(.badServerResponse)
}
return try JSONDecoder().decode([Kullanici].self, from: veri)
}
// Kullanım
Task {
do {
let kullanicilar = try await kullanicilariGetir()
print("\(kullanicilar.count) kullanıcı bulundu")
} catch {
print("Hata: \(error.localizedDescription)")
}
}
Uygulama Mimarisi: MVVM Deseni
Profesyonel iOS projelerinde MVVM (Model-View-ViewModel) mimari deseni yaygın olarak tercih edilir. Bu desen, iş mantığını arayüzden ayırarak kodun test edilebilirliğini ve bakımını kolaylaştırır.
// Model
struct Gorev: Identifiable {
let id = UUID()
var baslik: String
var tamamlandi: Bool
}
// ViewModel
class GorevListesiViewModel: ObservableObject {
@Published var gorevler: [Gorev] = []
func gorevEkle(baslik: String) {
let yeniGorev = Gorev(baslik: baslik, tamamlandi: false)
gorevler.append(yeniGorev)
}
func gorevSil(indexSet: IndexSet) {
gorevler.remove(atOffsets: indexSet)
}
}
// View
struct GorevListesiView: View {
@StateObject private var viewModel = GorevListesiViewModel()
@State private var yeniGorevBasligi = ""
var body: some View {
List {
ForEach(viewModel.gorevler) { gorev in
Text(gorev.baslik)
}
.onDelete(perform: viewModel.gorevSil)
}
}
}
Sonraki Adımlar ve Öneriler
iOS geliştirme yolculuğunuzda ilerlemek için aşağıdaki konulara odaklanmanız önerilir:
- Core Data veya SwiftData: Karmaşık veri modellerini yerel olarak saklamak için Apple'ın kalıcılık framework'lerini öğrenin.
- Combine Framework: Reaktif programlama ile asenkron veri akışlarını yönetin.
- Unit ve UI Testleri: XCTest framework'ü ile kodunuzun doğruluğunu garanti altına alın.
- App Store Yayınlama: Sertifikalar, Provisioning Profile'lar ve App Store Connect süreçlerini öğrenin.
- Erişilebilirlik (Accessibility): VoiceOver ve Dynamic Type desteği ile uygulamanızı herkes için kullanılabilir hale getirin.
Swift ve iOS ekosistemi sürekli gelişmektedir. Apple'ın her yıl WWDC'de duyurduğu yenilikleri takip etmek, güncel kalmak için önemlidir. Başlangıç olarak küçük projeler geliştirin, açık kaynak projelere katkıda bulunun ve Swift topluluğundaki tartışmaları takip edin. Pratik yaparak ve gerçek projeler geliştirerek en hızlı şekilde ilerleme kaydedeceksiniz.