如何将NSPointerArray转换为Array?技术实现方法咨询
当然可以实现NSPointerArray到Array的转换!
NSPointerArray本身确实没有直接提供filter方法,不过我们可以通过遍历它的元素,把非空对象收集到普通Array中,之后就能用上Swift标准库的过滤方法了。
具体实现方式
你可以给NSPointerArray写一个扩展,添加一个转Array的方法,这样复用起来非常方便:
extension NSPointerArray { func toArray<T>() -> [T] where T: AnyObject { var resultArray = [T]() for index in 0..<self.count { guard let pointer = self.pointer(at: index), let targetObject = Unmanaged<T>.fromOpaque(pointer).takeUnretainedValue() else { continue } resultArray.append(targetObject) } return resultArray } }
代码细节说明
- 我们遍历
NSPointerArray的每个索引,先取出对应的指针pointer(at:) - 通过
Unmanaged.fromOpaque将指针转换为对应的对象,这里用takeUnretainedValue()是因为NSPointerArray默认是弱引用模式;如果你的数组是用strongObjects()创建的强引用数组,记得换成takeRetainedValue(),避免内存泄漏 - 转换过程会自动跳过已经被释放的对象(指针对应的nil),最终返回的Array里只会包含当前存活的对象
使用示例
假设你有一个存储UIView的NSPointerArray:
let pointerArray = NSPointerArray.weakObjects() // 先往数组里添加一些UIView对象 let view1 = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 50)) let view2 = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 50)) pointerArray.addPointer(Unmanaged.passUnretained(view1).toOpaque()) pointerArray.addPointer(Unmanaged.passUnretained(view2).toOpaque()) // 转换为普通Array let viewArray: [UIView] = pointerArray.toArray() // 现在就能正常使用filter方法了! let wideViews = viewArray.filter { $0.frame.width > 100 }
内容的提问来源于stack exchange,提问作者AppleBee
相关产品推荐
相关产品推荐

