为什么Xcode/Swift坚持我需要为Delegate和Data Source方法使用override关键字?

kev*_*eon 1 xcode uitableview ios swift

如果我使用override关键字,以下代码可以正常工作,因为Xcode坚持认为我...但是如果我删除了override关键字(如下面数据源扩展中所示),我会遇到构建错误.我看到人们在整个地方以完全相同的方式组织他们的代码,但他们没有使用override关键字...任何帮助?我的意思是,显然如果我只是添加override关键字,一切都很好,但我想知道"为什么?".这是Swift 1.2中的新功能,我只是看到一堆旧代码?

import UIKit

class EventsTableViewController: UITableViewController {

    var events = [Event]()

    override func viewDidLoad() {
        super.viewDidLoad()

        var newEvent = Event(id: 1, type: "Birthday Party", city: "Dallas", state: "TX", date: "Saturday, July 12, 2015", time: "6:00PM - 11:00PM", details: "Some really cool stuff! Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius blandit sit amet non magna. Nulla vitae elit libero, a pharetra augue. Etiam porta sem malesuada magna mollis euismod.")

        events.append(newEvent)

        newEvent = Event(id: 2, type: "Christmas Party", city: "Houston", state: "TX", date: "Friday, December 11, 2015", time: "6:00PM - 11:00PM", details: "Santa Clause and what not")

        events.append(newEvent)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // cast a var as destination View Controller
        let eventDetail = segue.destinationViewController as! EventDetialViewController

        // Pass the selected event over
        if let indexPath = tableView.indexPathForSelectedRow() {
            let selectedEvent = events[indexPath.row]
            eventDetail.currentEvent = selectedEvent
        }
    }

}

// MARK: - Table view data source
extension EventsTableViewController: UITableViewDataSource {

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return events.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) as! UITableViewCell

        let currentEvent = events[indexPath.row]

        cell.textLabel?.text = "\(currentEvent.type) - \(currentEvent.date)"

        return cell
    }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*rne 6

如果视图控制器继承自UITableViewController,则需要使用override关键字,因为Apple已经在UITableViewController中实现了这些方法,并且您正在覆盖它们.

如果您的视图控制器继承自UIViewController,并且符合UITableViewDataSource和UITableViewDelegate协议,那么您不需要override关键字,因为您提供了协议方法的第一个实现.