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

标签 ios xcode swift uitableview

如果我像 Xcode 坚持的那样使用 override 关键字,下面的代码绝对可以正常工作...但是如果我删除 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
    }
}

最佳答案

如果您的 View Controller 继承自 UITableViewController,则需要使用 override 关键字,因为 Apple 已经在 UITableViewController 中实现了这些方法,而您正在覆盖它们。

如果您的 View Controller 继承自 UIViewController,并符合 UITableViewDataSource 和 UITableViewDelegate 协议(protocol),那么您不需要 override 关键字,因为您提供了协议(protocol)方法的第一个实现。

关于ios - 为什么 Xcode/Swift 坚持要求我对 Delegate 和 Data Source 方法使用 override 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31271867/

相关文章:

swift - Swift 中的错误 - 类型 "x"的预期声明和值没有成员 "y"(附图)

ios - 可以从命令行更新 iOS 配置文件吗?

ios - LoadVIew() 中的 UIVisualEffectView

ios - ScrollView 导航链接在 VStack 和 GeometryReader、XCode12、beta 4 中仍然处于事件状态

xcode - 如何自动安装 Xcode?

ios - 最小化跟踪代码

swift - xcode 和 swift : Navigate to ta bbar controller after facebook login in

ios - 分发时手动集成框架失败

xcode - Swift 中的简单程序。这是如何固定的?

Swift 泛型引用类型