2016-09-16 1 views
2

Я играю mp3-файл, хранящийся в каталоге активов приложения iOS & Я объявляю свой AVAudioPlayer, когда объявляю плеер с широким охватом приложения. Мой код работает отлично, но я хотел бы знать, если это плохая практика & если да, то почему. Большинство примеров коды воспроизведения аудио объявить AVPlayer как дополнительные, но не создать игрок в декларации, например, так:Можно ли создать AVAudioPlayer() в объявлении переменных и избежать опций/разворачивания?

var audioPlayer: AVAudioPlayer? 

я реализую ниже б/с не имеют какие-либо ссылок на опции или принудительные разворачивания (I «Я просто наращиваю себя в Swift, но я использую это как ранний пример« Возбужденный »для своих учеников, чтобы они могли воспроизводить медиа в одном из своих первых приложений. Надеемся отложить обсуждение опций до конца.

// Объявляем AVAudioPlayer и назначить пустой игрок

var audioPlayer = AVAudioPlayer() 

// Вызов этой функции для воспроизведения mp3-звук в файле активов под названием "sound0"

func playSound() { 
    if let sound = NSDataAsset(name: "sound0") { 
     do { 
      try audioPlayer = AVAudioPlayer(data: sound.data) 
      audioPlayer.play() 
     } catch { 
      print("ERROR: Couldn't create the AVAudioPlayer") 
     } 
    } else { 
     print("ERROR: Couldn't load sound file from asset catalog. Verify file is a valid sound file and that the name is correct.") 
    } 
} 

// Спасибо!

ответ

1

Объявление AVAudioPlayer важно, чтобы объект сохранялся во время воспроизведения звука, поэтому лучше всего объявить игрока как свойство, похожее на то, что вы это сделали.

Я вижу вашу цель, желая отложить изучение дополнительных вариантов до тех пор, пока я не увижу, что вы пытаетесь сделать, установив игрока на пустой игрок.

я мог бы предложить объявить игрок, как неявно дополнительно:

уага аудиоплеер: AVAudioPlayer!

Неявно необязательные переменные не требуют разворачивания - отлично, если вы знаете, что переменная не будет использоваться перед использованием, но не может быть инициализирована в методе init.

Вы можете сообщить своим ученикам, чтобы они не беспокоились о '!' на данный момент, и он поддерживает использование audioPlayer так же, как и в вашем примере кода. (Фактически, большинство IBOutlets объявляются таким образом при реализации пользовательского интерфейса)

Не рекомендуется устанавливать плеер на пустой плеер, потому что вы выделяете память для объекта, который никогда не используется.

Надеюсь, что это поможет!

+0

Вот отличная статья, которая более подробно описывает неявные варианты: http://stackoverflow.com/questions/24006975/why-create-implicitly-unwrapped-optionals –

+0

Большое спасибо. Все это очень полезно. И спасибо за подтверждение подхода в порядке! – Gallaugher

Смежные вопросы