2016-04-17 9 views
2

Swiftプロトコルのオプションメソッドをオーバーライドする方法はありますか?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:"

問題は何であるセレクタに応答しませんか?

+1

[Swift Bugs Futureのゴースト](https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future) – ColGraff

+0

このリンクをご利用いただきありがとうございます! –

答えて

2

UITableViewControllerはプロトコルではなくクラスです。プロトコルでは、クラスに必要なメソッドを宣言できます。プロトコル拡張は、プロトコルメソッドのデフォルトの実装を書く能力を与え、クラスがこのプロトコルを "継承"する場合でも、このメソッドを実装する必要はありませんが、デフォルトの実装を変更することができます。

あなたは、このようなコードの何かを書く場合:

protocol ExampleProtocol { 
    func greetings() -> String 
} 

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

class Example : ExampleProtocol { 

} 

を、あなたがあなたのコンソール上の「Hello World」を見ることができますが、あなたがあれば、あなたのクラスでこのメソッドを再書き込み:

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

ちょうど "こんにちは"が表示されます。 このメソッドをクラスから削除し、プロトコル拡張の宣言を削除すると、エラーが表示されます。「Example Example to protocol ExampleProtocolに準拠していません」と表示されます。

関連する問題