2016-04-17 12 views
2

Gibt es Möglichkeiten, optionale Methoden im Swift-Protokoll zu überschreiben?Optionale Methoden im Swift-Protokoll und Überlastung

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") 
    } 
} 

Warum in UIKit gibt es ähnliches Beispiel?

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 Anweisung erforderlich !!! Aber UITableViewController reagiert nicht auf Selektor "tableView: estimatedHeightForRowAtIndexPath:"

Was ist ein Problem?

+1

Hier ist ein großartiger Artikel über all dies: [Der Geist der schnellen Fehler Zukunft] (https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future) – ColGraff

+0

Vielen Dank für diesen Link ! –

Antwort

2

UITableViewController ist eine Klasse, kein Protokoll. Im Protokoll können Sie eine Methode angeben, die von Ihrer Klasse benötigt wird. Protokollerweiterungen geben Ihnen die Möglichkeit, die Standardimplementierung Ihrer Protokollmethode zu schreiben, und selbst wenn Ihre Klasse dieses Protokoll "erbt", müssen Sie diese Methode nicht implementieren, aber Sie können die Standardimplementierung ändern.

Wenn Sie Code schreiben, so etwas wie diese:

protocol ExampleProtocol { 
    func greetings() -> String 
} 

extension ExampleProtocol { 
    func greetings() -> String { 
     return "Hello World" 
    } 
} 

class Example : ExampleProtocol { 

} 

dann können Sie sehen, „Hallo Welt“ auf der Konsole, aber wenn Sie diese Methode in Ihrer Klasse neu schreiben:

func greetings() -> String { 
    return "Hello" 
} 

jetzt Du wirst nur "Hallo" sehen. Sie können diese Methode aus Ihrer Klasse entfernen und die Protokollerweiterungsdeklaration entfernen und dann wird der Fehler angezeigt: "Typ Beispiel, das nicht dem Protokoll ExampleProtocol entspricht".