อะไรคือ“ โปรโตคอล…สามารถใช้เป็นข้อ จำกัด ทั่วไปได้เพราะมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง” หมายความว่าอย่างไร


123

ฉันกำลังพยายามสร้างพจนานุกรม (จริงๆแล้วเป็นHashSet ) ที่คีย์บนโปรโตคอลที่กำหนดเองใน Swift แต่มันทำให้ฉันมีข้อผิดพลาดในชื่อ:

โปรโตคอล 'myProtocol' สามารถใช้เป็นข้อ จำกัด ทั่วไปเท่านั้นเนื่องจากมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง

และฉันไม่สามารถสร้างหัวหรือหางของมันได้

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes นั่นไม่ซ้ำกัน ฉันกำลังถามความหมายของข้อความแสดงข้อผิดพลาด "ข้อกำหนดประเภทตนเองหรือที่เกี่ยวข้อง" คืออะไร?
devios1

คำตอบ:


90

พิธีสารObservingสืบทอดจากโปรโตคอลซึ่งจะสืบทอดมาจากโปรโตคอลHashable EquatableโปรโตคอลEquatableมีข้อกำหนดดังต่อไปนี้:

func ==(lhs: Self, rhs: Self) -> Bool

และโปรโตคอลที่มีSelfบางส่วนอยู่ภายในนั้นไม่สามารถใช้ได้ทุกที่ยกเว้นในข้อ จำกัด ประเภท

นี่คือคำถามที่คล้ายกัน


7
... เนื่องจากคอมไพเลอร์ต้องตรวจสอบให้แน่ใจว่าเป็นประเภทเดียวกันในด้านใดด้านหนึ่ง แต่โปรโตคอลเท่านั้นที่มั่นใจได้ว่าเป็นไปตามสัญญา ฉันเห็น. ถึงกระนั้นดูเหมือนว่าEquatableไม่จำเป็นต้องบอกเป็นนัยEquatableเนื่องจากไม่จำเป็นอย่างยิ่งในการสร้างรหัสแฮช
devios1

4
ไม่ต้องรอเพราะDictionaryต้องสามารถรู้ได้ว่าวัตถุที่กำหนดเป็นคีย์ที่ถูกต้องหรือไม่เพราะเป็นไปได้ที่วัตถุสองชิ้นที่แตกต่างกันจะสร้างรหัสแฮชเดียวกัน อืมมันค่อนข้างยุ่งยาก Equatableดังนั้นปัญหาที่นี่คือจริงๆกับ
devios1

4
ดูที่ 0:56 ในการนำเสนอที่ยอดเยี่ยมโดย Alexis Gallagher หัวข้อ: Protocols with Associated types และวิธีที่พวกเขาได้รับในลักษณะนั้น (อาจจะ) youtu.be/XWoNjiSPqI8
finneycanhelp

@finneycanhelp ขอบคุณสำหรับสิ่งนี้👍👍 วิดีโอยอดเยี่ยม!
devios1

11

ในการแก้ปัญหานี้คุณสามารถใช้ generics ลองพิจารณาตัวอย่างนี้:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.