Обмен данными между быстрыми классами - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть этот класс с именем 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"]

я получаю:

Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

и print("Sources: \(sources)") возвращает sources [].

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

На самом деле, здесь есть странные вещи: почему у вас есть общий экземпляр, если вы его не используете? И затем, вы пытаетесь воспроизвести пустой массив, возможно, это проблема. Попробуйте дать значения до запуска игрока

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.

0 голосов
/ 03 апреля 2019

Если вы хотите использовать общий экземпляр (что, я думаю, вам подходит), используйте что-то вроде этого:

AudioController.shared.sources = ["Shakira"]

Вы также, вероятно, должны добавить private init() {}, чтобы предотвратить случайную инициализацию AudioController.Это сделает приватный инициализатор, который не может быть использован вне AudioController.

Оператор print всегда будет печатать [], потому что когда вызывается функция init, в массиве еще ничего нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...