You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:35:33