İlk hatam varsa sen yönteme presentError(...)
için planı ile protokol ErrorPopoverRenderer
oluşturmak, lütfen beni düzeltin. Daha sonra, presentError(...)
yöntemine ilişkin (zorunlu) planı uygulayarak bu protokole uymak için UIViewController
sınıfını genişletmeniz gerekir.
Bu, alt sınıf için UIViewController)
alt sınıfına ErrorPopoverRenderer
ek protokol kısıtlaması alt sınıfını uygulayabileceğiniz anlamına gelir. UIViewController
protokole ErrorPopoverRenderer
uygun şekilde genişletildi olmasaydı, bağlantılı örnekte müteakip kod sunulduğu gibi (... does not comply to protocol ErrorPopoverRenderer
)
Ancak
class KrakenViewController: UIViewController, ErrorPopoverRenderer {
func failedToEatHuman() {
//…
//Throw error because the Kraken sucks at eating Humans today.
presentError(ErrorOptions(message: "Oh noes! I didn't get to eat the Human!", size: CGSize(width: 1000.0, height: 200.0))) //Woohoo! We can provide whatever parameters we want, or no parameters at all!
}
}
, bu yöntemle olası bir sorun vardır derleme zamanı hatası harf olur senin link:
Artık her parametreyi biz bir ErrorView sunmak istiyorum her zaman uygulamak zorunda. Bu tür bir hata, protokol işlevi bildirimlerine varsayılan değerlerini sağlayamadığımızdan dolayı berbat.
protokol ErrorPopoverRenderer
Yani sadece UIViewController
tarafından kullanım için uygun değildir: s (ya da bunların alt sınıfları), daha sonra yukarıdaki solüsyonu çok genel değildir.
biz ErrorPopoverRenderer
daha geniş kullanıma sahip olmak istiyorsanız
, biz
protokol uzantıları protokol faydalanmak olabilir her sınıf türü için
spesifik planları yerleştirin. Bu yöntem,
presentError()
metodunun
ErrorPopoverRenderer
planlarının daha spesifik kısımlarının, protokole uygun olabilecek farklı sınıflar için farklı şekilde belirtilebildiği ve bu nedenle
presentError()
yönteminin daha minimalist hale getirilebileceği gibi, gerçekten temizdir.
ben örnekten, alıntı:
burada Self kullanarak o uzatma sadece hiç konformerde UIViewController devralır ancak ve ancak gerçekleşeceğini gösterir. Bu, bize , ErrorPopoverRenderer'ın UIViewController'ı bile genişletmeden ve UIViewController olduğunu kabul etmemizi sağlar. kod artık presentError()
arayacak bir görünüm denetleyicisi olduğunu (biz zaten 1. yılında, yaptığımız) bilir beri bu yöntemde
, biz, doğrudan planı uygulanmasında belirli UIViewController
şeyler yerleştirebilirsiniz ve uzun bir argüman listesi olarak göndermeye gerek yok. Dolayısıyla, 2., biz biraz kod tekrarını en aza anlamda bu özel kullanım, daha "genel" yaklaşımının bir tür için (: s birkaç farklı UIViewController
den presentError()
vs presentError(... lots of args ...)
arayarak gibi). böylece UIViewController
her örneği artık sahip protokolden yöntemlere & özelliklerine erişmek,
extension UIViewController: ErrorPopoverRenderer { }
aslında UIViewController
sınıfını genişleten: