Swift报错Cannot find 'midiManager' in scope修复方法
Swift编译错误:
Cannot find 'midiManager' in scope 问题复现代码
menu.swift
struct MainMenuBar: MenuBar { public var body: StandardMenuBar { StandardMenu(title: "Midi Devices") { midiManager.endpoints.outputs.forEach { device in TextMenuItem(title: device.name) { _ in print(device.uniqueID) } } } } }
midi.swift
@objc(ReactNativeMidiModule) class ReactNativeMidiModule: RCTEventEmitter, NSApplicationDelegate { // Create midi manager public let midiManager = MIDI.IO.Manager( clientName: "MIDIEventLogger", model: "ELMC Midi Monitor", manufacturer: "ELMC") // other code }

错误根因
midiManager是ReactNativeMidiModule类的实例属性,不属于全局作用域,也没有被传入MainMenuBar结构体的作用域内,编译器无法识别该变量,直接触发找不到变量的编译错误。
修复方法
MIDI管理器属于全局唯一的基础工具实例,优先使用单例模式实现跨作用域访问:
- 为
ReactNativeMidiModule添加静态共享单例属性,修改midi.swift代码:
@objc(ReactNativeMidiModule) class ReactNativeMidiModule: RCTEventEmitter, NSApplicationDelegate { // 全局共享单例实例 static let shared = ReactNativeMidiModule() // MIDI管理器实例 public let midiManager = MIDI.IO.Manager( clientName: "MIDIEventLogger", model: "ELMC Midi Monitor", manufacturer: "ELMC") // 其余业务代码 }
- 修改menu.swift中访问
midiManager的逻辑,通过单例属性访问MIDI管理器:
struct MainMenuBar: MenuBar { public var body: StandardMenuBar { StandardMenu(title: "Midi Devices") { // 显式通过单例访问midiManager实例 ReactNativeMidiModule.shared.midiManager.endpoints.outputs.forEach { device in TextMenuItem(title: device.name) { _ in print(device.uniqueID) } } } } }
注意:编译通过后需要确认MIDI管理器的初始化、系统权限申请、设备扫描逻辑在菜单渲染前执行完毕,避免运行时出现设备列表为空的问题。
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

