找到第一个共享的父节点,它可以工作但是可以更多地完成Swift-y吗?

时间:2018-06-13 18:03:55

标签: ios swift uiview

代码完成了我现在想做的事情,所以我纯粹是为了学习一些东西。因为我一直想知道是否有更多的功能或Swift-y方式来做到这一点。

目标是确定UIView oneViewUIView 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
}

1 个答案:

答案 0 :(得分:0)

我设法将其压缩为以下内容:

func viewHierarchy(for view: UIView) -> [UIView] {
    return [view] + (view.superview.map(viewHierarchy) ?? [])
}

我认为没有中间的var

会更好

对其进行了更多编辑,因此我摆脱了匿名$0