What is Generics
Generics เป็นอีกหนึ่งความสามารถในภาษา Swift ที่ทำให้เราสามารถนำ code เดิมกลับมาใช้ซ้ำได้ โดยตัว Generic จะไม่ได้ผูกติดกับชนิดข้อมูลใดข้อมูลหนึ่ง หมายความว่า ถ้าเรามี function ที่รับ parameter เป็น Int
เราก็จะส่งแค่ตัวแปรประเภท Int
เข้าไปได้เพียงอย่างเดียว แต่ถ้าเราใช้ parameter เป็น Generic เราจะสามารถส่งตัวแปรประเภทอื่นเข้าไปได้ เช่น ส่ง Double
หรือ Float
เข้าไป ถ้ายังไม่เข้าใจ เรามาดูตัวอย่างกันหน่อย
Problem
ตัวอย่างผมมี function สำหรับสลับค่า 2 ตัวแปร Int
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
แล้วถ้าผมอยากใช้กับ String ด้วยละ ก็ต้องเขียนขึ้นมาอีก function
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}
แล้วถ้า ผมอยากใช้กับ Double ด้วยละ ก็ต้องเขียนขึ้นมาอีก function จะเห็นว่ามันไม่ดีเอาซะเลยที่ต้องมาเขียน function เดิมซ้ำๆ ตรงนี้แล้วที่เราสามารถนำ Generics เข้ามาแก้ปัญหาเหล่านี้ได้
Solution
วิธีการก็แค่ แทนที่จะเราจะระบุ type นั้นๆใน parameter ให้เราเปลี่ยนเป็น T
จริงๆ เป็นชื่ออะไรก็ได้นะ แต่โดยส่วนมากจะใช้ T เป็นอันเข้าใจตรงกันว่านี่คือ Generics Type
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
มาลองเรียนใช้งานกันหน่อย
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)") // someInt is now 107, and anotherInt is now 3
มาลองใช้กัน type String กันบ้าง
var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
print("someString is now \(someString), and anotherString is now \(anotherString)") // someString is now world, and anotherString is now hello