cv.cm

Pemrograman · Bahasa pemrograman

Tutorial Swift untuk pemula

6 menit baca

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.

Buka Pemformat JSON

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
./hello

Untuk 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.

TipeContohCatatan
Intlet n = 4264-bit di platform modern
Doublelet x = 3.14Tipe floating-point default
Boollet ok = truetrue atau false
Stringlet s = "hi \(name)"Teks Unicode, value type
Characterlet 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)                                       // 2

Collection 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") // none

if 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.14

Struct 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)                    // nil

Program 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 let atau properti dari struct let. Gunakan var bila nilainya harus berubah.
  • Mengira struct dibagi seperti objek. Mengubah salinan tidak mengubah aslinya; gunakan class bila Anda butuh identitas bersama.
  • Mengindeks String dengan integer, seperti s[0]. Gunakan s.first, s.prefix(3), atau nilai String.Index.
  • Mencampur Int dan Double dalam aritmetika tanpa konversi, yang merupakan error kompilasi.
  • Lupa try sebelum pemanggilan yang bisa melempar error, atau memakai try!, 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.

Semua tutorial pemrograman