簡體   English   中英

Swift 協議中的可選方法和重載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM