Not olduğunu aşağıdaki derler: Ancak
protocol Foo {
associatedtype A
}
struct Container<F: Foo> {
func f(a: F.A) { }
}
, söz konusu:
struct Container<F: Foo> {
func f<A : F.A>(a: A) { } // error: inheritance from non-protocol, non-class type
}
... iyi olabilir, böylece tip F.A
tamamen kısıtsız olduğunusözdizimini kullanamayacağınız veya bunlarla uyumlu olamayacağınız bir Int
. Eğer gerçekten (a: F.A)
daha genel bir çözüm gerekiyorsa
sonra bu satırlar boyunca bir şey bunu yapabilir:
protocol Bar { }
protocol Foo {
associatedtype A : Bar
}
struct Container<F: Foo> {
func f<A : Bar>(a: A) { }
}
Artık Bar
protokolü kullanılarak a
parametresi hakkında herhangi bir beklentileri ifade edebilir.
Daha da iyisi, sen Foo
bir uzantısı olarak yöntemini uygulamak mümkün olabilir: Benim kullanım durumunda
protocol Foo {
associatedtype A
func f(_: A) // if you want this to be a requirement
}
extension Foo /* where A is constrained so you can do something with it */ {
func f(a: A) { }
}
, 'Container' yöntemi' f' Foo 'bir alt sınıf olarak kısıtlı olmalıdır 'tür. Yani, ya Foo.A ya da bir alt sınıfa yazılmalıdır. F.A'nın sınırsız olduğunu söylediğinizde sorun olduğundan emin değilim. Sonuçta, "A" Bar "," türkçe (a: A) {} "işlevlerini yerine getirmemiz hâlâ başarısız olur. – Stephen
Hiç biriyle ilişkili tür A: Bar', func f (a: A) {} '- gerçekten başarısız olması gerektiğini önerdim. Lütfen "Bar" snippet'ine daha dikkatli bir göz atın ... Ayrıca, ihtiyacınız olan şey ise "Bar" ı belirli bir sınıfla değiştirebileceğinizi de unutmayın. “Emin olmamak” konusuna gelince, benim açıklamalarım için herhangi bir itirazınız var mıdır (örneğin, “Fİ” nin bir “Int” olması durumunda)? – milos
Snippet'lerimiz arasındaki farkı fark ettim. Hatanın nedeni olarak F.A'nın tamamen sınırsız olduğunu söylediğiniz yere yanıt veriyorum. Kısıtlamalarla bile, sonuç aynıdır. İlişkilendirilmiş bir tür neden bir kısıtlama olarak kullanılmaz? – Stephen