Apa yang dimaksud dengan "Protokol ... hanya dapat digunakan sebagai batasan umum karena memiliki persyaratan Jenis Sendiri atau terkait"?

123

Saya mencoba membuat Dictionary (sebenarnya HashSet ) yang dikunci pada protokol khusus di Swift, tetapi memberi saya kesalahan pada judul:

Protokol 'myProtocol' hanya dapat digunakan sebagai batasan umum karena memiliki persyaratan Jenis Sendiri atau terkait

dan saya tidak bisa membuat kepala atau ekor dari itu.

protocol Observing: Hashable { }

var observers = HashSet<Observing>()
devios1
sumber
@jtbandes Itu bukan duplikat. Saya bertanya apa arti sebenarnya dari pesan kesalahan tersebut. Apa yang dimaksud dengan "Persyaratan tipe diri atau terkait"?
devios1

Jawaban:

90

Protokol Observingmewarisi dari protokol Hashable, yang pada gilirannya mewarisi dari protokol Equatable. Protokol Equatablememiliki persyaratan berikut:

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

Dan protokol yang berisi Selfsuatu tempat di dalamnya tidak dapat digunakan di mana pun kecuali dalam batasan tipe.

Ini pertanyaan serupa.

newacct
sumber
7
... karena kompilator harus memastikan jenisnya sama di kedua sisi, tetapi protokol hanya memastikannya memenuhi kontrak. Saya melihat. Namun, sepertinya Equatabletidak selalu berarti Equatablekarena itu tidak sepenuhnya diperlukan untuk menghasilkan kode hash.
devios1
4
Oh tidak, tunggu, karena Dictionaryharus dapat mengetahui apakah objek yang diberikan memang kunci yang benar, karena mungkin saja dua objek berbeda menghasilkan kode hash yang sama. Hmm, itu agak rumit. Jadi masalahnya di sini sebenarnya dengan Equatable.
devios1
4
Lihatlah 0:56 presentasi hebat oleh Alexis Gallagher berjudul: Protokol dengan Jenis Terkait dan bagaimana mereka mendapatkannya (mungkin) youtu.be/XWoNjiSPqI8
finneycanhelp
@finneycanhelp Terima kasih untuk ini 👍👍. Video yang bagus!
devios1
11

Untuk mengatasi ini, Anda bisa menggunakan obat generik. Pertimbangkan contoh ini:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
ph1lb4
sumber