Ios 找到第一个共享的parentnode,它可以工作,但可以做得更快吗?

Ios 找到第一个共享的parentnode,它可以工作,但可以做得更快吗?,ios,swift,uiview,Ios,Swift,Uiview,代码做了我现在想要它做的事情,所以我问这个问题纯粹是为了学习一些东西。因为我一直在想是否有一种更实用或快捷的方法来做这件事 目标是确定UIViewoneView是否是UIView另一个视图的父视图或子视图,或者它们是否共享一个共同的祖先。我不喜欢的一件事是我使用了var视图:[UIView]=[view],难道没有一种方法可以直接将它压缩成一个列表而不初始化var?或者我可能错过的任何其他改进 private static func determineSharedNode(between one

代码做了我现在想要它做的事情,所以我问这个问题纯粹是为了学习一些东西。因为我一直在想是否有一种更实用或快捷的方法来做这件事

目标是确定
UIView
oneView
是否是
UIView
另一个视图的父视图或子视图,或者它们是否共享一个共同的祖先。我不喜欢的一件事是我使用了
var视图:[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

代码评论可以发布在