Pemrograman · Bahasa pemrograman
Tutorial Swift untuk pemula
Jawaban singkat
Swift adalah bahasa terkompilasi yang cepat dan aman, dibuat oleh Apple untuk aplikasi iPhone, iPad, Mac, Apple Watch, dan Apple TV, dan juga berjalan di Linux dan Windows. Simpan print("Hello, world") di hello.swift lalu jalankan swift hello.swift. Konsep intinya: konstanta let dan variabel var, type inference, optional untuk nilai yang mungkin tidak ada, struct dan enum dengan semantik nilai, protocol, serta error yang ditangani dengan do/try/catch.
Apa itu Swift dan untuk apa dipakai
Swift diperkenalkan Apple pada 2014 sebagai pengganti modern Objective-C dan dijadikan open source pada 2015; proyeknya ada di swift.org. Swift adalah bahasa utama untuk aplikasi di platform Apple, biasanya dengan framework SwiftUI atau UIKit. Swift juga dipakai untuk kode sisi server (misalnya dengan framework Vapor) dan tool command line. Bahasa ini dirancang untuk mencegah bug umum: variabel harus diinisialisasi, array memeriksa batasnya, dan nil harus ditangani secara eksplisit.
Instal Swift dan jalankan Hello, world
Di Mac, instal Xcode dari App Store atau command-line tools Xcode. Di Linux dan Windows, unduh toolchain dari swift.org. Periksa dengan swift --version.
print("Hello, world")swift hello.swift
# Hello, world
swiftc hello.swift -o hello # compile to a binary
./helloUntuk proyek yang lebih besar, jalankan swift package init --type executable lalu swift run. Playground Xcode adalah cara mudah lain untuk bereksperimen.
Konstanta, variabel, dan tipe data dasar
Gunakan let untuk konstanta dan var untuk variabel. Utamakan let; compiler memberi peringatan bila var tidak pernah diubah. Tipe disimpulkan, dan Swift tidak pernah mengonversi antartipe numerik secara implisit.
| Tipe | Contoh | Catatan |
|---|---|---|
Int | let n = 42 | 64-bit di platform modern |
Double | let x = 3.14 | Tipe floating-point default |
Bool | let ok = true | true atau false |
String | let s = "hi \(name)" | Teks Unicode, value type |
Character | let c: Character = "é" | Satu karakter menurut persepsi pengguna |
[Int], [String: Int] | [1, 2], ["a": 1] | Array dan dictionary |
let name = "Ada"
var count = 7
count += 1
let avg = Double(count) / 2 // explicit conversion
print("\(name) has \(count) items, avg \(avg)") // Ada has 8 items, avg 4.0
print(7 / 2, 7 % 2) // 3 1\(expression) di dalam string literal menyisipkan sebuah nilai (string interpolation).
Alur kontrol
let score = 72
if score >= 90 {
print("A")
} else if score >= 70 {
print("B") // B
} else {
print("C")
}
for i in 0..<3 {
print(i, terminator: " ") // 0 1 2
}
print()
var n = 10
while n > 1 { n /= 2 }
print(n) // 1
let day = "SAT"
switch day {
case "SAT", "SUN":
print("weekend") // weekend
default:
print("weekday")
}switch harus exhaustive, tidak lanjut ke case berikutnya secara default, dan dapat mencocokkan range (case 90...100:), tuple, dan case enum.
Fungsi dan closure
Parameter memiliki argument label yang ditulis pemanggil, sehingga pemanggilan terbaca seperti kalimat. Gunakan _ untuk menghilangkan label. Closure adalah fungsi tanpa nama yang ditulis dalam kurung kurawal.
func greet(_ name: String, with greeting: String = "Hello") -> String {
return "\(greeting), \(name)!"
}
print(greet("Lin")) // Hello, Lin!
print(greet("Lin", with: "Hi")) // Hi, Lin!
let nums = [3, 1, 2, 5]
let squares = nums.map { $0 * $0 }
let evens = nums.filter { $0 % 2 == 0 }
let sorted = nums.sorted(by: >)
print(squares, evens, sorted) // [9, 1, 4, 25] [2] [5, 3, 2, 1]$0 merujuk ke argumen closure pertama. Ketika closure adalah argumen terakhir, ia dapat ditulis setelah tanda kurung (sintaks trailing closure).
Array, dictionary, dan set
var fruits = ["apple", "pear"]
fruits.append("fig")
print(fruits.count, fruits[0], fruits.contains("fig")) // 3 apple true
var ages: [String: Int] = ["ann": 31, "bob": 25]
ages["cy"] = 40
for (person, age) in ages.sorted(by: { $0.key < $1.key }) {
print(person, age) // ann 31, bob 25, cy 40
}
print(ages["zed", default: 0]) // 0
let tags: Set = ["b", "a", "b"]
print(tags.count) // 2Collection adalah value type: menugaskan array ke variabel lain membuat salinan independen (disalin secara lazy, hanya ketika salah satunya berubah). Array let tidak dapat diubah sama sekali.
Fitur khas: optional
Nilai yang mungkin tidak ada memiliki tipe optional, ditulis String?. Anda tidak dapat memakainya sebagai String sebelum di-unwrap, sehingga compiler memaksa Anda menangani kasus nil.
let input = "42"
let number: Int? = Int(input) // nil if input is not a number
if let number { // unwrap: runs only when not nil
print("got \(number)") // got 42
}
func firstWord(_ text: String) -> String? {
text.split(separator: " ").first.map(String.init)
}
guard let word = firstWord("hello world") else {
fatalError("no words")
}
print(word) // hello
print(firstWord("")?.uppercased() ?? "none") // noneif let dan guard let melakukan unwrap dengan aman, ?. (optional chaining) memanggil method hanya bila nilainya ada, dan ?? memberi nilai default. Force unwrap value! membuat program crash bila nilainya nil, jadi pakai sesekali saja. Bentuk singkat if let number membutuhkan Swift 5.7 ke atas.
Struct, class, enum, dan protocol
Struct dan enum adalah value type; class adalah reference type dengan pewarisan. Kode Swift lebih menyukai struct dan protocol (interface) daripada hierarki class.
protocol Shape {
func area() -> Double
}
struct Rect: Shape {
var width: Double
var height: Double
func area() -> Double { width * height }
}
enum Circle: Shape {
case unit
case radius(Double)
func area() -> Double {
switch self {
case .unit: return Double.pi
case .radius(let r): return Double.pi * r * r
}
}
}
let shapes: [any Shape] = [Rect(width: 2, height: 3), Circle.radius(1)]
let total = shapes.reduce(0) { $0 + $1.area() }
print((total * 100).rounded() / 100) // 9.14Struct mendapat memberwise initializer secara otomatis (Rect(width:height:)). Case enum dapat membawa associated value, seperti .radius(Double).
Penanganan error
Fungsi yang bisa gagal ditandai throws. Pemanggil harus memakai try di dalam blok do/catch, atau memakai try? untuk mengubah error menjadi nil.
enum AgeError: Error {
case notANumber(String)
case negative
}
func parseAge(_ text: String) throws -> Int {
guard let age = Int(text) else { throw AgeError.notANumber(text) }
guard age >= 0 else { throw AgeError.negative }
return age
}
do {
print(try parseAge("41")) // 41
print(try parseAge("abc"))
} catch AgeError.notANumber(let text) {
print("not a number: \(text)") // not a number: abc
} catch {
print("other error: \(error)")
}
let maybe = try? parseAge("-3") // nil
print(maybe as Any) // nilProgram kecil yang lengkap: frekuensi kata
import Foundation
let args = CommandLine.arguments
guard args.count == 2 else {
print("usage: swift words.swift FILE")
exit(1)
}
do {
let text = try String(contentsOfFile: args[1], encoding: .utf8).lowercased()
let words = text.split { !$0.isLetter && $0 != "'" }
var counts: [Substring: Int] = [:]
for word in words {
counts[word, default: 0] += 1
}
for (word, n) in counts.sorted(by: { $0.value > $1.value }).prefix(5) {
print(String(n).padding(toLength: 6, withPad: " ", startingAt: 0) + word)
}
} catch {
print("cannot read \(args[1]): \(error.localizedDescription)")
exit(1)
}Jalankan dengan swift words.swift notes.txt. Foundation menyediakan pembacaan file dan helper string; tersedia di platform Apple serta di toolchain Linux dan Windows.
Kesalahan umum pemula
- Mencoba mengubah konstanta
letatau properti dari structlet. Gunakanvarbila nilainya harus berubah. - Mengira struct dibagi seperti objek. Mengubah salinan tidak mengubah aslinya; gunakan class bila Anda butuh identitas bersama.
- Mengindeks
Stringdengan integer, sepertis[0]. Gunakans.first,s.prefix(3), atau nilaiString.Index. - Mencampur
IntdanDoubledalam aritmetika tanpa konversi, yang merupakan error kompilasi. - Lupa
trysebelum pemanggilan yang bisa melempar error, atau memakaitry!, yang crash saat terjadi error.
Langkah selanjutnya
Baca "The Swift Programming Language" di docs.swift.org, panduan dan referensi resmi, serta pusat dokumentasi di swift.org. Untuk aplikasi, ikuti tutorial SwiftUI dari Apple di Xcode. Lalu pelajari Swift concurrency (async/await dan actor), generic, dan Swift Package Manager untuk dependensi.
FAQ
Apakah Swift hanya untuk platform Apple?
Tidak. Swift open source dan juga berjalan di Linux dan Windows, serta dipakai untuk kode sisi server dan tool. Namun, framework aplikasi seperti SwiftUI dan UIKit hanya untuk Apple.
Sebaiknya belajar Swift atau Objective-C?
Pelajari Swift. Swift adalah bahasa yang direkomendasikan Apple untuk aplikasi baru, dan dapat memanggil kode Objective-C yang sudah ada bila perlu.
Apa perbedaan struct dan class di Swift?
Struct adalah value type yang disalin saat ditugaskan atau dikirim; class adalah reference type, sehingga semua variabel berbagi satu instance. Class juga mendukung pewarisan dan deinitializer.
Apa arti tanda tanya setelah tipe?
Int? adalah optional: ia menampung Int atau nil. Anda harus meng-unwrap-nya, misalnya dengan if let, sebelum memakai nilainya.