0Pricing
Swift Academy · บทเรียน

ข้อจำกัดของพารามิเตอร์ชนิด

กำหนดให้พารามิเตอร์แบบทั่วไปต้องสอดคล้องตามโพรโทคอล

ข้อจำกัดของพารามิเตอร์ชนิด เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ข้อจำกัดของพารามิเตอร์ชนิด
  2. อนุประโยค where ในฟังก์ชัน
  3. การจำกัดชนิดที่เกี่ยวข้อง
  4. ซับสคริปต์และส่วนขยายแบบทั่วไป
← กลับไปที่ Swift Academy