Swift - Generik
Bahasa Swift 4 menyediakan fitur 'Generik' untuk menulis fungsi dan tipe yang fleksibel dan dapat digunakan kembali. Generik digunakan untuk menghindari duplikasi dan menyediakan abstraksi. Library standar Swift 4 dibuat dengan kode generik. Jenis 'Array' dan 'Kamus' Swift 4s milik koleksi umum. Dengan bantuan array dan kamus, array didefinisikan untuk menampung nilai 'Int' dan nilai 'String' atau jenis lainnya.
func exchange(a: inout Int, b: inout Int) {
let temp = a
a = b
b = temp
}
var numb1 = 100
var numb2 = 200
print("Before Swapping values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping values are: \(numb1) and \(numb2)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Before Swapping values are: 100 and 200
After Swapping values are: 200 and 100
Fungsi Generik: Jenis Parameter
Fungsi umum dapat digunakan untuk mengakses tipe data apa pun seperti 'Int' atau 'String'.
func exchange<T>(a: inout T, b: inout T) {
let temp = a
a = b
b = temp
}
var numb1 = 100
var numb2 = 200
print("Before Swapping Int values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are: \(numb1) and \(numb2)")
var str1 = "Generics"
var str2 = "Functions"
print("Before Swapping String values are: \(str1) and \(str2)")
exchange(a: &str1, b: &str2)
print("After Swapping String values are: \(str1) and \(str2)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Before Swapping Int values are: 100 and 200
After Swapping Int values are: 200 and 100
Before Swapping String values are: Generics and Functions
After Swapping String values are: Functions and Generics
Fungsi pertukaran () digunakan untuk menukar nilai yang dijelaskan dalam program di atas dan <T> digunakan sebagai parameter tipe. Untuk pertama kalinya, function exchange () dipanggil untuk mengembalikan nilai 'Int' dan panggilan kedua ke function exchange () akan mengembalikan nilai 'String'. Beberapa jenis parameter dapat dimasukkan di dalam tanda kurung sudut yang dipisahkan dengan koma.
Parameter tipe dinamai sesuai definisi pengguna untuk mengetahui tujuan dari parameter tipe yang dimilikinya. Swift 4 menyediakan <T> sebagai nama parameter tipe generik. Namun parameter tipe seperti Array dan Kamus juga dapat dinamai sebagai kunci, nilai untuk mengidentifikasi bahwa mereka termasuk dalam tipe 'Kamus'.
struct TOS<T> {
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Type Parameters")
print(tos.items)
tos.push(item: "Naming Type Parameters")
print(tos.items)
let deletetos = tos.pop()
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]
Memperluas Jenis Generik
Memperluas properti tumpukan untuk mengetahui bagian atas item disertakan dengan kata kunci 'ekstensi'.
struct TOS<T> {
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Type Parameters")
print(tos.items)
tos.push(item: "Naming Type Parameters")
print(tos.items)
extension TOS {
var first: T? {
return items.isEmpty ? nil : items[items.count - 1]
}
}
if let first = tos.first {
print("The top item on the stack is \(first).")
}
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
["Swift 4"]
["Swift 4", "Generics"]
["Swift 4", "Generics", "Type Parameters"]
["Swift 4", "Generics", "Type Parameters", "Naming Type Parameters"]
The top item on the stack is Naming Type Parameters.
Ketik Batasan
Bahasa Swift 4 memungkinkan 'batasan tipe' untuk menentukan apakah parameter tipe mewarisi dari kelas tertentu, atau untuk memastikan standar kesesuaian protokol.
func exchange<T>(a: inout T, b: inout T) {
let temp = a
a = b
b = temp
}
var numb1 = 100
var numb2 = 200
print("Before Swapping Int values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are: \(numb1) and \(numb2)")
var str1 = "Generics"
var str2 = "Functions"
print("Before Swapping String values are: \(str1) and \(str2)")
exchange(a: &str1, b: &str2)
print("After Swapping String values are: \(str1) and \(str2)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Before Swapping Int values are: 100 and 200
After Swapping Int values are: 200 and 100
Before Swapping String values are: Generics and Functions
After Swapping String values are: Functions and Generics
Jenis Terkait
Swift 4 memungkinkan tipe terkait untuk dideklarasikan di dalam definisi protokol dengan kata kunci 'relatedtype'.
protocol Container {
associatedtype ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
struct TOS<T>: Container {
// original Stack<T> implementation
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(item: T) {
self.push(item: item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> T {
return items[i]
}
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Type Parameters")
print(tos.items)
tos.push(item: "Naming Type Parameters")
print(tos.items)
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]
Dimana Klausul
Batasan tipe memungkinkan pengguna untuk menentukan persyaratan pada tipe parameter yang terkait dengan fungsi atau tipe generik. Untuk menentukan persyaratan untuk tipe terkait klausa 'where' dideklarasikan sebagai bagian dari daftar parameter tipe. Kata kunci 'di mana' ditempatkan segera setelah daftar parameter tipe diikuti dengan batasan tipe terkait, hubungan kesetaraan antara tipe dan tipe terkait.
protocol Container {
associatedtype ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
struct Stack<T>: Container {
// original Stack<T> implementation
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(item: T) {
self.push(item: item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> T {
return items[i]
}
}
func allItemsMatch<
C1: Container, C2: Container
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
(someContainer: C1, anotherContainer: C2) -> Bool {
// check that both containers contain the same number of items
if someContainer.count != anotherContainer.count {
return false
}
// check each pair of items to see if they are equivalent
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}
// all items match, so return true
return true
}
var tos = Stack<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Where Clause")
print(tos.items)
var eos = ["Swift 4", "Generics", "Where Clause"]
print(eos)
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Where Clause]
[Swift 4, Generics, Where Clause]