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

macOS应用遍历窗口时,如何满足条件停止枚举?

解决macOS中enumerateWindows停止枚举的指针赋值问题

嘿,这个问题我之前调试代码时也踩过坑!你遇到的Cannot assign to value: 'stop' is a 'let' constant错误,核心是没搞对UnsafeMutablePointer<ObjCBool>的使用方式——这个stop变量本身是一个指针常量(你不能改变它指向的内存地址),但你完全可以修改它指向的那个布尔值,这才是让枚举停止的正确姿势。

修正后的代码

把你原来的stop = true改成stop.pointee = true就可以了,完整代码如下:

NSApplication.shared.enumerateWindows(options: .orderedFrontToBack, using: { (window: NSWindow, stop: UnsafeMutablePointer<ObjCBool>) in
    if let vc = window.contentViewController as? SomeCustomViewController {
        if someCondition {
            // 修改指针指向的布尔值,而非指针本身
            stop.pointee = true
        }
    }
})

简单解释一下

UnsafeMutablePointer<ObjCBool>的本质是一个指向ObjCBool类型值的内存地址,系统通过这个指针把外部的布尔值传递给你的闭包。你不能直接给指针变量赋值(因为它是let常量),但通过.pointee属性,你可以修改它指向的那个实际的布尔值,当这个值被设为true时,enumerateWindows就会立即停止遍历后续的窗口。

如果你的逻辑需要,设置完stop.pointee = true后也可以加个return提前退出闭包,但其实只要这个值被设为true,枚举就会自动终止,所以这一步不是必须的。

内容的提问来源于stack exchange,提问作者Frank R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:29:41