XCode自动填充什么时候建议覆盖'对于超类的Swift方法?

时间:2017-01-05 16:37:59

标签: ios swift xcode

在XCode中编写下面的代码示例时,在向dismiss(animated: true, completion: nil)添加方法调用时,自动完成功能显示的匹配项不包含override关键字。

但是,我添加prepare(for segue:)时的自动填充建议包含override关键字。

为什么?我知道override暗示该方法是超类的一部分,但我不明白为什么XCode假设一个方法可以被覆盖而另一个方法可以被覆盖。

import UIKit

class MusicListVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.blue
    }

    @IBAction func backBtnPressed(_ sender: AnyObject) {
        dismiss(animated: true, completion: nil)
    }

    @IBAction func loadThirdScreenPressed(_ sender: AnyObject) {
        let songTitle = "Quit Playing Games With My Heart"
        performSegue(withIdentifier: "PlaySongVC", sender: songTitle)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? PlaySongVC {
            if let song = sender as? String {
                destination.selectedSong = song
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

主要区别是

  • dismiss是一种方法调用(在另一种方法中)。
  • prepare(for是一种方法声明(位于班级的顶层)。

您只能在声明方法时覆盖方法和属性。

答案 1 :(得分:0)

您必须覆盖 prepare(for:sender:),因为您正在实施从UIViewController继承的此方法的自己版本(如您所述)。 Xcode能够推断出这一点,因为您在编写MusicListVC: ViewController时声明了类型关系。因此,当您开始输入 时,它可以为您提供有用的建议。 Xcode可以推断出你属于一个类的范围,因此它可以合理地建议你声明方法或属性。

对于dismiss(animated:completion:),您正在调用由UIViewController定义的现有方法。因为您属于另一种方法(backBtnPressed(_:))的范围,当然还取决于您开始输入的内容,Xcode可以再次推断您希望调用 dismiss(animated:completion:)方法压倒它。

如果您更改范围,从backBtnPressed(_:)方法到类MusicListVC的范围,那么您会注意到当您开始键入dismiss(animated:completion:)并按Enter键时,它将会提供覆盖方法模板。

Xcode的假设至少基于您输入的 以及您输入的