Anladığım kadarıyla, derleyici aşırı yük çözünürlüğü gerçekleştirirken genel olarak açıkça yazılan bir parametreyi tercih edecektir. Böylece, test<T : P>(_ o: T)
ve test(_ o: Any)
arasındaki çözünürlükte - ikincisi, açık (her ne kadar soyut) bir parametre tipine sahip olduğundan tercih edilirken, ilki sadece bir yer tutucudur. Eğer jenerik yanı ikinci aşırı yaparsanız
nedenle, derleyici şimdi ikisi de açıkça yazılan parametrenin olmaması gibi birinci aşırı lehine olacaktır, ancak ilk aşırı yük daha sıkı kısıtlanır:
class Bar {
func test<T: P>(_ o: T) {
print("Generic", o.getValue())
}
func test<T>(_ o: T) {
print("Any")
}
}
let foo = Foo()
let bar = Bar()
bar.test(foo) // Generic hello
Eğer irade aşırı hakkında daha iyi ikna etmeye izin verdiği
class Bar {
func test<T: P>(_ o: T) {
print("Generic", o.getValue())
}
func test(_ o: Any) {
print("Any")
}
}
let foo = Foo()
let bar = Bar()
(bar.test as (Foo) -> Void)(foo) // Generic hello
şiddetle, ilk yaklaşım öneriyoruz rağmen:
olduğu gibi aşırı yüklenmeleri tutulması, tip-döküm da belirginleştirmek için uygulanabilir bir çözüm gibi görünüyor seçilecek (jenerik Ayrıca, mümkün olan her durumda protokol tipi parametreler üzerinden de tercih edilmelidir, due to the performance benefits of specialisation).
En basit çözüm, 'Any' aşırı yükünü' test etmek (_ :) 'jenerik - i.e' func test (_ o: T) '(bunun doğrudan sorunuzu yanıtlayıp yanıtlamadığından emin olmamak) olacaktır. –
Hamish
Genel yöntem bu durumda daha spesifik değil. Test (_ o: Any) 'argümanı, 'Foo' örneğini kendi argümanı olarak başarılı bir şekilde sarmalayabilen 'Any' (her birinin bir protokoldü olsa bile) 'in bir _koncrete type_'ından biridir. Herhangi bir beton türü, jenerik olandan daha spesifik olacaktır ve eski, "bar.test (...)" ifadesini çağırırken aşırı yüklenme çözünürlüğünden öncelikli olacaktır. Genel olarak 'Any' öğesini bir beton türü olarak kullanmaktan kaçınmalısınız ve daha iyi bir yaklaşım da alt katman olacaktır. Yukarıda @Hamish tarafından tanımlanan kısıtlanmamış jenerik ile (bu durumda kısıtlı jenerik daha spesifik olacaktır). – dfri