我想我正在与泛型作斗争。我想创建简单的 UIView 扩展以递归查找在函数参数中传递的类的 super View 。我希望该函数返回可选值,其中显然包含 nil,或者作为所提供类的实例可见的对象。
extension UIView {
func superviewOfClass<T>(ofClass: T.Type) -> T? {
var currentView: UIView? = self
while currentView != nil {
if currentView is T {
break
} else {
currentView = currentView?.superview
}
}
return currentView as? T
}
}
非常感谢任何帮助。
最佳答案
swift 3/4
这是一种更简洁的方式:
extension UIView {
func superview<T>(of type: T.Type) -> T? {
return superview as? T ?? superview.compactMap { $0.superview(of: type) }
}
func subview<T>(of type: T.Type) -> T? {
return subviews.compactMap { $0 as? T ?? $0.subview(of: type) }.first
}
}
用法:
let tableView = someView.superview(of: UITableView.self)
let tableView = someView.subview(of: UITableView.self)
关于Swift 使用泛型查找给定类的 super View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37705819/