gpt4 book ai didi

ios - 高效地迭代 subview 并返回过滤后的 UIView 子集

转载 作者:行者123 更新时间:2023-11-28 08:59:38 25 4
gpt4 key购买 nike

尝试在 swift 上实现“css 选择器”遍历方法。

我有以下实现:

var CLASSNAME_HANDLE: UInt8 = 0
extension UIView {
@IBInspectable var className: String {
get {
var optionalObject:AnyObject? = objc_getAssociatedObject(self, &CLASSNAME_HANDLE)

if let object:AnyObject = optionalObject {
return object as! String
} else {
return "" // default value when uninitialized
}
}
set {
objc_setAssociatedObject(self, &CLASSNAME_HANDLE, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
}

func getViewsByClass(cls: String) -> Array<UIView>{
return selectViews({
var classFound = false
split($0.className){separator in
separator == " "}.forEach({ className in
classFound = classFound || className == cls
})
return classFound
})
}

func selectViews(filter:(UIView) -> Bool) -> Array<UIView>{
var views = Array<UIView>()

for view in self.subviews{
if view.subviews.count > 0{
views.extend((view as! UIView).selectViews(filter))
}

}

views.extend(self.subviews.filter({ return filter($0 as! UIView) }) as! [UIView])
return views
}

}

extension Array {
func forEach(doThis: (element: T) -> Void) {
for e in self {
doThis(element: e)
}
}
}

这允许我在界面构建器中添加一个 className 属性,如下所示: enter image description here

一切都按预期工作,但性能可能会更好。

问:如何优化这段代码?或者是否有更好的方法来迭代 subview 并返回过滤后的子集。

感谢任何建议:)

最佳答案

我认为您的代码在大多数情况下都非常快。如果你想让它表现得更好,你需要预先计算结果。 IE 每个 UIView 都应该有一个以类名作为键的字典和一个 UIView 数组,这些 UIView 是它的后代,带有该类名。

这可以在添加或删除 subview 时使用 UIView 通知来完成。您需要将它一直向上链接到最顶层的 super View 。通过这种方式,您可以以更昂贵的插入和删除为代价来加快检索速度。

但在 UIView 本身上执行此操作可能涉及调配和 .

您可以通过在任何给定 UIView 之外为系统中的所有 UIView 存储一个巨大的全局字典来避免 swizzling。

这是一个有点轻率的方案,我并不是建议您这样做,只是分享一种可以加快计算速度的方法。

关于ios - 高效地迭代 subview 并返回过滤后的 UIView 子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com