代码完成了我现在想做的事情,所以我纯粹是为了学习一些东西。因为我一直想知道是否有更多的功能或Swift-y方式来做到这一点。
目标是确定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
}
答案 0 :(得分:0)
我设法将其压缩为以下内容:
func viewHierarchy(for view: UIView) -> [UIView] {
return [view] + (view.superview.map(viewHierarchy) ?? [])
}
我认为没有中间的var
对其进行了更多编辑,因此我摆脱了匿名$0