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
相关产品推荐
相关产品推荐

