ข้อจำกัดแบบเวียนเกิดและเจเนอริกระดับสูง
เขียน ข้อจำกัดแบบเวียนเกิด (เช่น ลำดับซ้อนกัน) และฟังก์ชัน เจเนอริกระดับสูง ที่รับคลอสเชอร์/ฟังก์ชันเจเนอริก
ข้อจำกัดแบบเวียนเกิดและเจเนอริกระดับสูง เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน
อะไรและเพราะเหตุใด
บทเรียนนี้แสดงให้เห็น:
- ข้อจำกัดแบบเวียนเกิด: ข้อจำกัดบนสมาชิกชนิดข้อมูลทั่วไปที่ซ้อนกัน (เช่น Sequence ของ Sequence)
- ชนิดข้อมูลทั่วไปลำดับสูง: ฟังก์ชันทั่วไปที่รับคลอสเชอร์หรือฟังก์ชันทั่วไป
ลำดับซ้อนกัน (flatten)
ตัวอย่างคลาสสิกของข้อจำกัดแบบเวียนเกิด: เรากำหนดให้ C.Element: Sequence เพื่อให้วนซ้ำลงไปได้สองระดับ
// Works for any Collection whose elements are Sequences
func flatten<C: Collection>(_ c: C) -> [C.Element.Element]
where C.Element: Sequence {
var result: [C.Element.Element] = []
result.reserveCapacity(c.reduce(0) { $0 + ($1 as AnySequence<C.Element.Element>).underestimatedCount })
for inner in c {
for e in inner { result.append(e) }
}
return result
}
let nested = [[1,2], [3], [4,5]]
print(flatten(nested)) // [1,2,3,4,5]ใช้ map กับโครงสร้างซ้อนแบบทั่วไป
เรากำหนดข้อจำกัดสองชั้น: C: Collection และ C.Element: Collection ทำให้เรียกใช้ map ในแต่ละระดับได้
// Map over a two-level structure without fixing concrete types
func mapNested<C: Collection, R>(_ c: C, _ transform: (C.Element.Element) -> R) -> [[R]]
where C.Element: Collection {
return c.map { inner in inner.map(transform) }
}
let doubled = mapNested([[1,2],[3]], { $0 * 2 })
print(doubled) // [[2,4],[6]]compose(f,g)
ชนิดข้อมูลทั่วไปลำดับสูง: ฟังก์ชันนี้เป็นฟังก์ชันทั่วไปที่ทำงานกับฟังก์ชันโดยตรง ทำให้สร้างกระบวนการประมวลผลต่อเนื่องที่นำกลับมาใช้ใหม่ได้ เช่น compose
// Compose two generic transforms that work on the same element type
func compose<A, B, C>(
_ f: @escaping (B) -> C,
_ g: @escaping (A) -> B
) -> (A) -> C {
{ a in f(g(a)) }
}
let toString: (Int) -> String = { "\\($0)" }
let length: (String) -> Int = { $0.count }
let intToLen = compose(length, toString)
print(intToLen(1234)) // 4พารามิเตอร์คลอสเชอร์ทั่วไป
คลอสเชอร์ f ก็เป็นพารามิเตอร์ชนิดข้อมูลทั่วไปเช่นกัน เราทำให้ชนิดข้อมูลยืดหยุ่นได้ด้วยข้อจำกัดแบบ where
// A generic "transform each" that accepts ANY transform (generic in T/U)
func transformEach<T, U, C: Collection>(_ c: C, using f: (T) -> U) -> [U]
where C.Element == T {
var out: [U] = []
out.reserveCapacity(c.count)
for x in c { out.append(f(x)) }
return out
}
let words = ["swift","kit"]
print(transformEach(words, using: { $0.uppercased() })) // ["SWIFT","KIT"]แนวทาง
เคล็ดลับ:
- เขียนข้อจำกัดให้น้อยที่สุดเท่าที่จำเป็น (
SequenceแทนCollectionเมื่อเหมาะสม) - เลือกใช้อนุประโยค where เพื่อให้อ่านง่าย
- ทดสอบด้วยชนิดข้อมูลรูปธรรมหลายชนิดเพื่อให้แน่ใจว่าทั่วไปเพียงพอ
- เขียนเอกสารอธิบายสมมติฐาน (เช่น ลำดับของสมาชิกและความไม่ซ้ำกัน)
คำจำกัดความของชนิดข้อมูลทั่วไปลำดับสูง
ตรวจสอบอย่างรวดเร็ว: อะไรทำให้ฟังก์ชันหนึ่งเป็นฟังก์ชันชนิดข้อมูลทั่วไปลำดับสูง
สรุป
สรุป: ใช้ข้อจำกัดแบบเวียนเกิด (เช่น C.Element: Sequence) เพื่อทำงานกับชนิดข้อมูลทั่วไปที่ซ้อนกัน และใช้ชนิดข้อมูลทั่วไปลำดับสูงเพื่อประกอบกระบวนการประมวลผลต่อเนื่องของฟังก์ชันที่นำกลับมาใช้ใหม่ได้อย่างเป็นระเบียบ
คำถามที่พบบ่อย
บทเรียน “ข้อจำกัดแบบเวียนเกิดและเจเนอริกระดับสูง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ข้อจำกัดแบบเวียนเกิดและเจเนอริกระดับสูง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ข้อจำกัดแบบเวียนเกิดและเจเนอริกระดับสูง”
เขียน ข้อจำกัดแบบเวียนเกิด (เช่น ลำดับซ้อนกัน) และฟังก์ชัน เจเนอริกระดับสูง ที่รับคลอสเชอร์/ฟังก์ชันเจเนอริก คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน
บทเรียน “ข้อจำกัดแบบเวียนเกิดและเจเนอริกระดับสูง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสอดคล้องแบบมีเงื่อนไข
- ข้อจำกัดแบบเวียนเกิดและเจเนอริกระดับสูง
- ส่วนคำสั่ง where บนส่วนขยาย