代码做了我现在想要它做的事情,所以我问这个纯粹是为了学习一些东西。因为我一直想知道是否有一种更实用或更快速的方法来做到这一点。
目标是弄清楚是否 UIView
oneView
是 UIView
的父级或子级anotherView
,或者说他们有共同的祖先。我不喜欢的一件事是我使用 var views: [UIView] = [view]
,有没有办法直接将其压缩为列表而不初始化 var
?或者我可能错过了任何其他改进?
private static func determineSharedNode(between oneView: UIView, and anotherView: UIView) throws -> UIView {
let oneViewStack = viewHierarchy(for: oneView)
let anotherViewStack = viewHierarchy(for: anotherView)
let sharedViews = oneViewStack.filter(anotherViewStack.contains)
guard let firstSharedView = sharedViews.first else {
throw ParentChildError.doNotShareNode
}
return firstSharedView
}
private static func viewHierarchy(for view: UIView) -> [UIView] {
var views: [UIView] = [view]
if let superview = view.superview {
views.append(contentsOf: viewHierarchy(for: superview))
}
return views
}
最佳答案
我已设法将其浓缩为以下内容:
func viewHierarchy(for view: UIView) -> [UIView] {
return [view] + (view.superview.map(viewHierarchy) ?? [])
}
我认为没有中间 var
会好很多
对其进行了更多编辑,因此我摆脱了匿名 $0
关于ios - 找到第一个共享父节点,它可以工作,但是可以做得更多 Swift-y 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50843548/