С учетом этих фактов:
1) Лучше инициализировать объекты как let (неизменяемые), а не var, когда это возможно.
2) Некоторые объекты могут выдавать, когда вы вызываете их инициализатор (такие как AVAudioPlayer, , например ).
3) Некоторые объекты имеют инициализаторы, которые требуют аргументов, которые недоступны до «self доступен», еще раз, например, AVAudioPlayer, поэтому, если оничтобы быть классовым / нелокальным let, то они должны быть инициализированы не до или после, а только внутри init ().
Так, например, допустим, у нас есть класс, в который мы хотимопределить свойство уровня класса типа AVAudioPlayer (или любого другого объекта, чей метод init вызывает), но мы хотим, чтобы оно было разрешено.
После долгих проб и ошибок, согласовывая свой обход предупреждений X-кода,и экспериментируя с опциями, лучшее, что я придумал (с помощью), это:
import AVFoundation
class MySoundPoolPlayer {
private let dingURL = Bundle.main.url(forResource: "ding", withExtension: "wav")
private let dongURL = Bundle.main.url(forResource: "dong", withExtension: "wav")
private let dingPlayer: AVAudioPlayer?
private let dongPlayer: AVAudioPlayer?
init() {
dingPlayer = try? AVAudioPlayer(contentsOf: dingURL!)
dongPlayer = try? AVAudioPlayer(contentsOf: dongURL!)
}
func playDing() {
dingPlayer!.play()
}
func playDong() {
dongPlayer!.play()
}
func stopAllSounds() {
dingPlayer!.stop()
dongPlayer!.stop()
}
}
Итак, теперь в основном у нас есть неизменное значение, которое может быть нулевым, если AVAudioPlayer.init () выбрасывает ... но, по крайней мере, это let, и, поскольку оно установлено как необязательное, приложение не будет аварийно завершать работу, если AVAudioPlayer.init () выбрасывает.
Есть ли лучший способделать это?
Как лучше всего инициализировать объекты этих типов (как на уровне класса)?
Большое спасибо за ваше время и внимание!XD