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

Swift报错Cannot find 'midiManager' in scope修复方法

Swift编译错误:Cannot find 'midiManager' in scope

问题复现代码

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管理器属于全局唯一的基础工具实例,优先使用单例模式实现跨作用域访问:

  1. 为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")

  // 其余业务代码
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 11:30:44