找到第一个共享父节点,它可以工作,但可以做得更 Swift-y 吗?



代码做了我现在想要它做的事情,所以我问这个纯粹是为了学习一些东西。因为我一直想知道是否有一种更实用或 Swift-y 的方式来做到这一点。

目标是弄清楚UIViewoneViewUIViewanotherView的父母还是孩子,或者他们有一个共同的祖先。我不喜欢的一件事是我使用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

相关内容

最新更新