“Protokol… Kendine veya ilişkili tür gereksinimlerine sahip olduğu için yalnızca genel bir kısıtlama olarak kullanılabilir” ne anlama geliyor?


123

Swift'de özel bir protokole dayalı bir Sözlük (aslında bir HashSet ) oluşturmaya çalışıyorum , ancak bu bana başlıkta hata veriyor:

'MyProtocol' protokolü, Self veya ilişkili tür gereksinimlerine sahip olduğu için yalnızca genel bir kısıtlama olarak kullanılabilir

ve ben bununla ilgili ne yazı yazamıyorum.

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes Bu bir kopya değil. Hata mesajının gerçekte ne anlama geldiğini soruyorum. "Kendi kendine veya ilişkili tür gereksinimi" nedir?
devios1

Yanıtlar:


90

Protokol Observing, protokolden Hashablemiras alır ve bu da protokolden miras alır Equatable. Protokolün Equatableaşağıdaki gereksinimi vardır:

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

Ve içinde bir yeri içeren bir protokol, Selfbir tür kısıtlaması dışında hiçbir yerde kullanılamaz.

İşte benzer bir soru.


7
... çünkü derleyicinin her iki tarafta da aynı türde olduğundan emin olması gerekir , ancak protokol yalnızca sözleşmeyi karşılamasını sağlar. Anlıyorum. Yine de, bir karma kod oluşturmak için kesinlikle gerekli Equatableolmadığı için mutlaka ima etmesi gerekmiyor gibi görünüyor Equatable.
devios1

4
Oh hayır bekle, çünkü Dictionarybelirli bir nesnenin gerçekten doğru anahtar olup olmadığını bilmek gerekir, çünkü iki farklı nesnenin aynı hash kodunu oluşturması mümkündür. Hmm, bu biraz zor. Yani buradaki sorun gerçekten ile Equatable.
devios1

4
Alexis Gallagher tarafından yapılan, İlişkili Türlerle
finneycanhelp

@finneycanhelp Bunun için teşekkürler 👍👍. Harika video!
devios1

11

Bunu çözmek için jenerik kullanabilirsiniz. Şu örneği düşünün:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.