在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
}
}
}
}
答案 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的假设至少基于您输入的 以及您输入的 。