swift objective-c 错误无法将类型 () -> () 的值转换为指定类型 MIDI.IO.Manager

swift objective-c error Cannot convert value of type () -> () to specified type MIDI.IO.Manager

我收到错误消息:无法将类型“() -> ()”的值转换为指定类型 'MIDI.IO.Manager'

我将把 midiManager 创建的值公开给 React Native。只是不明白为什么我会收到此代码块的错误

我不知道如何解决这个问题,因为我是 swift 和 objective-c 的新手。任何帮助将不胜感激

import Foundation
import MIDIKit

@objc(MidiManager)
class MidiManager: NSObject{
  
  var midiManager: MIDI.IO.Manager = {
          let newManager = MIDI.IO.Manager(
              clientName: "MIDIEventLogger",
              model: "LoggerApp",
              manufacturer: "Orchetect") { notification, manager in
                  print("Core MIDI notification:", notification)
              }
          do {
              logger.debug("Starting MIDI manager")
              try newManager.start()
          } catch {
              logger.default(error)
          }
    }
  

}

如果你想要可计算的属性,那么

var midiManager: MIDI.IO.Manager {   // 1) remove =
      let newManager = MIDI.IO.Manager(
          clientName: "MIDIEventLogger",
          model: "LoggerApp",
          manufacturer: "Orchetect") { notification, manager in
              print("Core MIDI notification:", notification)
          }
      do {
          logger.debug("Starting MIDI manager")
          try newManager.start()
      } catch {
          logger.default(error)
      }
      return newManager   // 2) return object
 }

如果你想用默认值初始化那么

var midiManager: MIDI.IO.Manager = {
      let newManager = MIDI.IO.Manager(
          clientName: "MIDIEventLogger",
          model: "LoggerApp",
          manufacturer: "Orchetect") { notification, manager in
              print("Core MIDI notification:", notification)
          }
      do {
          logger.debug("Starting MIDI manager")
          try newManager.start()
      } catch {
          logger.default(error)
      }
      return newManager   // 1) return object
 }()    // 2) make call

您正在将 () -> Void 类型的闭包分配给 MIDI.IO.Manager 类型的变量。您需要稍微更改一个闭包,然后实际调用它:

var midiManager: MIDI.IO.Manager = {
      let newManager = MIDI.IO.Manager(
          clientName: "MIDIEventLogger",
          model: "LoggerApp",
          manufacturer: "Orchetect") { notification, manager in
              print("Core MIDI notification:", notification)
          }
      do {
          logger.debug("Starting MIDI manager")
          try newManager.start()
      } catch {
          logger.default(error)
      }
      return newManager
}()

但我个人认为在初始化之后就启动管理器不是一个好主意。如果它因错误而失败,而你 return 它,应用程序逻辑可能会在某些地方中断。

您可能还想使 MIDI.IO.Manager let 可变,即不可变的。