Generic Fonksiyonlar
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 34 / 57.
Genel bir işlev herhangi bir türle çalışır. Açılı ayraçlar içindeki yer tutucu (çoğunlukla T), çağıranın kullandığı türü temsil eder ve Swift bunu her çağrıda yerine koyar:
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"]))Çıktı:
[3, 1]
["a", "c"]Fonksiyonun içinde T hakkında hiçbir şey bilinmez, bu nedenle yalnızca her türle çalışan işlemlere izin verilir. T: Comparable gibi bir kısıtlama daha fazlasına, burada < operatörüne izin verir:
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"])!)Çıktı:
9
zucchiniGenerics, Any'nin aksine tam türü korur. [Int] üzerindeki largest işlevinin sonucu bir Int? değeridir; bu nedenle dönüştürme yapmadan aritmetik işlemlerde kullanılabilir:
func largest<T: Comparable>(_ items: [T]) -> T? {
items.max()
}
let top = largest([3, 7, 5]) ?? 0
print(top * 10)Çıktı:
70Bir fonksiyonun birkaç yer tutucusu olabilir ve kısıtlamalar kendi protokollerinizi adlandırabilir:
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"))Çıktı:
7
10
1 & oneGörev
KolayHer türden bir dizi ve (T) -> Bool yüklemi alan ve koşulu sağlayan kaç öğe olduğunu döndüren genel countWhere(_:_:) işlevini ve herhangi bir Hashable türünden bir dizi alıp en sık görülen öğesini (sayılar eşit olduğunda dizide ilk görünen öğeyi) döndüren veya boş bir dizi için nil döndüren mostCommon(_:) işlevini yazın.
Sağlanan kod, virgülle ayrılmış bir sözcük satırını ve bir sayı satırını okur. 3 karakterden uzun sözcüklerin sayısını, en sık görülen sözcüğü, çift sayıların sayısını ve en sık görülen sayıyı yazdırır.
Kodunuz Functions.swift dosyasına yazılmalıdır. main.swift sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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")
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground