考虑到这些事实:
1) 只要可能,最好将对象初始化为let(不可变)而不是var。
2) 某些对象在调用其初始值设定项时会抛出(如AVAudioPlayer、,
).
3) 有些对象的初始值设定项需要在“self is available”之前不可用的参数,例如AVAudioPlayer,因此如果它们要成为类级/非本地let,则必须在init()内部初始化,而不是在其之前或之后初始化。
例如,假设我们有一个类,我们想在其中定义类型为AVAudioPlayer(或init方法抛出的任何其他对象)的类级属性,但我们希望它是一个let。
经过多次尝试和错误,协商解决X代码警告问题,并尝试使用optionals,我(在帮助下)得出的最好结果是:
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()
}
}
有更好的方法吗?
初始化这些类型的对象(作为类级别let)的最佳实践是什么?
非常感谢您的时间和考虑!除息的