Swift 中的超级前缀
super prefix in Swift
完全是 Swift/programming 的菜鸟所以请原谅这个看似显而易见的问题;
有人可以向我解释 super 前缀的功能吗?
它是否允许覆盖保留父 class 的功能?
我正在研究的教程告诉我它曾经让父 class 知道什么时候调用子 class?不确定我是否完全理解这一点。
在此先感谢您的帮助!
import UIKit
class ViewController: UITableViewController {
var pictures = [String]()
override func viewDidLoad() {
super.viewDidLoad()
let fm = FileManager.default
let path = Bundle.main.resourcePath!
let items = try! fm.contentsOfDirectory(atPath: path)
for item in items {
if item.hasPrefix("nssl") {
pictures.append(item)
}
}
}
}
想象一下 UITableViewController
在 viewDidLoad
中做了一些操作所必需的东西,就像您的视图控制器所做的那样。当您覆盖继承的方法时,将调用您的方法而不是超级 class 的方法。现在您有机会进行初始化,但是您剥夺了超级 class 进行初始化的机会。
要解决这个问题,您可以自己调用超级实现。许多 UIKit 视图循环方法 (view(Will|Did)(Load|Layout|Appear)
) 严格来说不需要调用,因为超级 class 实现什么都不做,但有些会。省略它们可能会导致古怪的结果,因此养成习惯调用此类方法的超级 class 实现通常是一个好习惯。
完全是 Swift/programming 的菜鸟所以请原谅这个看似显而易见的问题; 有人可以向我解释 super 前缀的功能吗? 它是否允许覆盖保留父 class 的功能? 我正在研究的教程告诉我它曾经让父 class 知道什么时候调用子 class?不确定我是否完全理解这一点。 在此先感谢您的帮助!
import UIKit
class ViewController: UITableViewController {
var pictures = [String]()
override func viewDidLoad() {
super.viewDidLoad()
let fm = FileManager.default
let path = Bundle.main.resourcePath!
let items = try! fm.contentsOfDirectory(atPath: path)
for item in items {
if item.hasPrefix("nssl") {
pictures.append(item)
}
}
}
}
想象一下 UITableViewController
在 viewDidLoad
中做了一些操作所必需的东西,就像您的视图控制器所做的那样。当您覆盖继承的方法时,将调用您的方法而不是超级 class 的方法。现在您有机会进行初始化,但是您剥夺了超级 class 进行初始化的机会。
要解决这个问题,您可以自己调用超级实现。许多 UIKit 视图循环方法 (view(Will|Did)(Load|Layout|Appear)
) 严格来说不需要调用,因为超级 class 实现什么都不做,但有些会。省略它们可能会导致古怪的结果,因此养成习惯调用此类方法的超级 class 实现通常是一个好习惯。