[英]Optional methods in Swift protocol and overloading
有沒有辦法覆蓋 Swift 協議中的可選方法?
protocol Protocol {
func requiredMethod()
}
extension Protocol {
func optionalMethod() {
// do stuff
}
}
class A: Protocol {
func requiredMethod() {
print("implementation in A class")
}
}
class B: A {
func optionalMethod() { // <-- Why `override` statement is not required?
print("AAA")
}
}
為什么在 UIKit 中有類似的例子?
protocol UITableViewDelegate : NSObjectProtocol, UIScrollViewDelegate {
// ......
optional public func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
}
class MyTVC: UITableViewController {
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{}
需要override
語句!!! 但是UITableViewController
不響應選擇器"tableView: estimatedHeightForRowAtIndexPath:"
什么是問題?
UITableViewController 是一個類,而不是一個協議。 在協議中,您可以聲明您的類所需的方法。 協議擴展使您能夠編寫協議方法的默認實現,然后即使您的類“繼承”此協議,您也不必實現此方法,但您可以更改默認實現。
如果你寫這樣的代碼:
protocol ExampleProtocol {
func greetings() -> String
}
extension ExampleProtocol {
func greetings() -> String {
return "Hello World"
}
}
class Example : ExampleProtocol {
}
那么你可以在你的控制台上看到“Hello World”,但是如果你在你的類中重寫這個方法:
func greetings() -> String {
return "Hello"
}
現在你只會看到“你好”。 您可以從您的類中刪除此方法並刪除協議擴展聲明,然后您將看到錯誤:“類型示例不符合協議 ExampleProtocol”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.