ข้อจำกัดของพารามิเตอร์ชนิด
กำหนดให้พารามิเตอร์แบบทั่วไปต้องสอดคล้องตามโพรโทคอล
ข้อจำกัดของพารามิเตอร์ชนิด เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทบทวน generic
ฟังก์ชัน generic ใช้พารามิเตอร์ชนิดข้อมูล เช่น <T> จึงทำงานกับชนิดข้อมูลได้หลายแบบ แต่ T ที่ไม่มีข้อจำกัดทำได้เพียงส่งต่อไปมา ไม่สามารถตรวจสอบภายในได้ ข้อจำกัด จะเปิดใช้ความสามารถต่าง ๆ
func identity<T>(_ x: T) -> T { x }
print(identity(5))
print(identity("hi"))ข้อจำกัด Comparable
การเขียน <T: Comparable> รับรองว่าค่าของ T รองรับ <, > และตัวดำเนินการที่เกี่ยวข้อง คุณจึงสามารถเปรียบเทียบค่าเหล่านั้นได้
func largest<T: Comparable>(_ a: T, _ b: T) -> T {
a > b ? a : b
}
print(largest(3, 9))
print(largest("apple", "pear"))เหตุใดจึงต้องมีข้อจำกัด
หากไม่มี Comparable คอมไพเลอร์จะปฏิเสธ a > b เพราะไม่ใช่ทุกชนิดข้อมูลจะรองรับการดำเนินการนี้ ข้อจำกัดคือคำรับรองที่ทำให้การดำเนินการดังกล่าวถูกต้องตามกฎ
func minOf<T: Comparable>(_ list: [T]) -> T? {
list.min()
}
print(minOf([4, 2, 8])!)ข้อจำกัด Equatable
Equatable เปิดใช้ == และ != ใช้เพื่อ count หรือค้นหาองค์ประกอบที่ตรงกัน
func count<T: Equatable>(_ x: T, in list: [T]) -> Int {
list.filter { $0 == x }.count
}
print(count(2, in: [2, 3, 2, 2]))ข้อจำกัด Hashable
Hashable ช่วยให้คุณใช้ values เป็นสมาชิกของ Set หรือเป็นคีย์ของพจนานุกรมได้
func unique<T: Hashable>(_ list: [T]) -> [T] {
Array(Set(list))
}
print(unique([1, 1, 2, 3, 3]).sorted())ข้อจำกัดด้านโปรโตคอล
โปรโตคอลใด ๆ ก็สามารถเป็นข้อจำกัดได้ ในที่นี้ โปรโตคอลที่กำหนดเองจะเปิดใช้เมธอดของโปรโตคอลนั้นกับพารามิเตอร์ generic
protocol Speaker { func speak() -> String }
struct Dog: Speaker { func speak() -> String { "Woof" } }
func announce<T: Speaker>(_ x: T) {
print(x.speak())
}
announce(Dog())ข้อจำกัดด้านคลาส
คุณสามารถกำหนดให้ T สืบทอดจากคลาสใดคลาสหนึ่งได้ เพื่อเข้าถึงสมาชิกของคลาสนั้น
class Animal { func name() -> String { "animal" } }
class Cat: Animal { override func name() -> String { "cat" } }
func describe<T: Animal>(_ x: T) { print(x.name()) }
describe(Cat())ข้อจำกัดหลายรายการ
รวมข้อจำกัดด้วย & เพื่อกำหนดให้สอดคล้องกับโปรโตคอลหลายรายการพร้อมกัน
func show<T: CustomStringConvertible & Equatable>(_ a: T, _ b: T) {
print(a.description, a == b)
}
show(5, 5)พารามิเตอร์ชนิดข้อมูลหลายตัว
ฟังก์ชันหนึ่งสามารถมีพารามิเตอร์ที่มีข้อจำกัดหลายตัว โดยแต่ละตัวมีข้อกำหนดของตนเอง
func zipMap<K: Hashable, V>(_ keys: [K], _ vals: [V]) -> [K: V] {
var d: [K: V] = [:]
for (k, v) in zip(keys, vals) { d[k] = v }
return d
}
print(zipMap(["a", "b"], [1, 2]))ข้อจำกัดบนชนิดข้อมูล
ชนิดข้อมูล generic ไม่ได้มีเพียงฟังก์ชันเท่านั้นที่รับข้อจำกัด ชนิดข้อมูลโครงสร้าง generic ก็สามารถกำหนดให้พารามิเตอร์ของตนสอดคล้องกับโปรโตคอลได้เช่นกัน
struct SortedBox<T: Comparable> {
var items: [T]
var smallest: T? { items.min() }
}
print(SortedBox(items: [5, 1, 9]).smallest!)ข้อจำกัดด้านตัวเลข
โปรโตคอลมาตรฐานอย่าง Numeric ช่วยให้โค้ด generic คำนวณเลขคณิตกับ Int, Double และชนิดอื่น ๆ ได้
func sum<T: Numeric>(_ list: [T]) -> T {
list.reduce(0, +)
}
print(sum([1, 2, 3]))
print(sum([1.5, 2.5]))ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับข้อจำกัดของพารามิเตอร์ชนิดข้อมูล
ทบทวน
ข้อจำกัดของพารามิเตอร์ชนิดข้อมูล (<T: Protocol> หรือ <T: SomeClass>) บอกคอมไพเลอร์ว่าชนิดข้อมูล generic ทำอะไรได้บ้าง คุณได้เห็น Comparable, Equatable, Hashable, Numeric, โปรโตคอลที่กำหนดเอง ข้อจำกัดด้านคลาส ข้อจำกัดหลายรายการด้วย & และข้อจำกัดบนชนิดข้อมูล generic แล้ว
คำถามที่พบบ่อย
บทเรียน “ข้อจำกัดของพารามิเตอร์ชนิด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ข้อจำกัดของพารามิเตอร์ชนิด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ข้อจำกัดของพารามิเตอร์ชนิด”
กำหนดให้พารามิเตอร์แบบทั่วไปต้องสอดคล้องตามโพรโทคอล คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ข้อจำกัดของพารามิเตอร์ชนิด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ข้อจำกัดของพารามิเตอร์ชนิด
- อนุประโยค where ในฟังก์ชัน
- การจำกัดชนิดที่เกี่ยวข้อง
- ซับสคริปต์และส่วนขยายแบบทั่วไป