Menu
CoddyTech

Fungsi Generik

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 34 dari 57.

Fungsi generik bekerja dengan tipe apa pun. Placeholder dalam tanda kurung sudut, biasanya T, mewakili tipe yang digunakan pemanggil, dan Swift mengisinya pada setiap pemanggilan:

func firstAndLast<T>(_ items: [T]) -> [T] {
    guard let first = items.first, let last = items.last else { return [] }
    return [first, last]
}

print(firstAndLast([3, 8, 1]))
print(firstAndLast(["a", "b", "c"]))

Output:

[3, 1]
["a", "c"]

Di dalam fungsi ini, tidak ada yang diketahui tentang T, jadi hanya operasi yang berlaku untuk setiap tipe yang diizinkan. Batasan seperti T: Comparable memungkinkan lebih banyak operasi, dalam kasus ini operator <:

func largest<T: Comparable>(_ items: [T]) -> T? {
    guard var best = items.first else { return nil }
    for item in items where item > best { best = item }
    return best
}

print(largest([4, 9, 2])!)
print(largest(["pear", "apple", "zucchini"])!)

Output:

9
zucchini

Generics mempertahankan tipe yang tepat, tidak seperti Any. Hasil largest pada [Int] adalah Int?, jadi bisa digunakan dalam operasi aritmetika tanpa casting:

func largest<T: Comparable>(_ items: [T]) -> T? {
    items.max()
}

let top = largest([3, 7, 5]) ?? 0
print(top * 10)

Output:

70

Sebuah fungsi dapat memiliki beberapa placeholder, dan batasan dapat menyebutkan protokol buatanmu sendiri:

protocol Scored { var score: Int { get } }
struct Player: Scored { let name: String; let score: Int }
struct Team: Scored { let score: Int }

func total<T: Scored>(_ items: [T]) -> Int {
    items.reduce(0) { $0 + $1.score }
}

func pair<A, B>(_ a: A, _ b: B) -> String { "\(a) & \(b)" }

print(total([Player(name: "a", score: 3), Player(name: "b", score: 4)]))
print(total([Team(score: 10)]))
print(pair(1, "one"))

Output:

7
10
1 & one
challenge icon

Tantangan

Mudah

Tulis fungsi generik countWhere(_:_:) yang menerima array dengan tipe apa pun dan predikat (T) -> Bool, lalu mengembalikan jumlah elemen yang memenuhi predikat tersebut. Tulis juga mostCommon(_:) yang menerima array dengan tipe apa pun yang Hashable dan mengembalikan elemennya yang paling sering muncul. Jika jumlah kemunculannya sama, pilih elemen yang muncul lebih dulu dalam array. Untuk array kosong, kembalikan nil.

Code yang disediakan membaca satu baris kata yang dipisahkan dengan koma dan satu baris angka. Code ini mencetak jumlah kata yang panjangnya lebih dari 3 karakter, kata yang paling sering muncul, jumlah angka genap, dan angka yang paling sering muncul.

Tulis kodemu di Functions.swift. main.swift berisi code input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan tetap seperti ini
var input: [String] = []
while let line = readLine() { input.append(line) }
let words = input[0].split(separator: ",").map(String.init)
let numbers = input[1].split(separator: ",").map { Int($0)! }
print(countWhere(words) { $0.count > 3 })
print(mostCommon(words) ?? "none")
print(countWhere(numbers) { $0 % 2 == 0 })
print(mostCommon(numbers).map { String($0) } ?? "none")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift