首页 > 解决方案 > 在 swift 类之间共享数据

问题描述

我调用了这个类AudioController(),它有一个名为的变量sources,它是一个字符串数组。

AudioViewController()代码:

import Foundation

class AudioController {
    static let shared = AudioController()
    var sources = [String]()

    init() {
      print("Sources: \(sources)")
      let controller = RemoteCommandController()
      player = QueuedAudioPlayer(remoteCommandController: controller)
      player.remoteCommands = [
        .stop,
        .play,
        .pause,
        .togglePlayPause,
        .next,
        .previous,
        .changePlaybackPosition
      ]
      try? audioSessionController.set(category: .playback)
      try? player.add(items: sources, playWhenReady: false) // fatal error here because sources is nil
    }
}

但。在我viewcontroller试图通过时sources

AudioController().sources = ["Shakira"]

我得到:

致命错误:在展开可选值时意外发现 nil

print("Sources: \(sources)")回报sources []

标签: swift

解决方案


实际上,这里有一些奇怪的事情:如果您不使用共享实例,为什么会有共享实例?然后,您正在尝试播放一个空数组,也许这就是问题所在。尝试在启动播放器之前给出值

class AudioController {
    static let shared = AudioController()
    var sources: [String]

    init(sources: [String]) {
      self.sources = sources
      print("Sources: \(sources)")
      let controller = RemoteCommandController()
      player = QueuedAudioPlayer(remoteCommandController: controller)
      player.remoteCommands = [
        .stop,
        .play,
        .pause,
        .togglePlayPause,
        .next,
        .previous,
        .changePlaybackPosition
      ]
      try? audioSessionController.set(category: .playback)
      try? player.add(items: self.sources, playWhenReady: false) // fatal error here because sources is nil
    }
}

// then instantiate the controller with sources
AudioController(sources: ["Shakira"])

但是,我建议您检查您的设计。也许开始在init.


推荐阅读