我有一个AVAudioPlayer,其中包含可观察对象中的一些关键数据:
class Player: ObservableObject {
var data: Data?
var player: AVAudioPlayer?
init() {}
func play(audioData: Data) {
self.stop()
// Set the data for the player
self.data = audioData
do {
self.player = try AVAudioPlayer(data: audioData)
} catch {
debugPrint("error")
}
// Play with the audio if it exists
player?.prepareToPlay()
player?.play()
}
func pause() {
player?.pause()
}
func stop() {
player?.stop()
player?.currentTime = 0
}
}
stop()
函数不称为player?.stop
,因为未知原因,AVAudioPlayer
为零(即使它正在播放音频(。
在视图中,当我播放它时,我想mutate
包含数据的struct
。视图如下:
struct MainView: View {
@ObservedObject var player = Player()
var body: some View {
ForEach(audioDataList) { audioData in
SubView(audioData: audioData).environmentObject(player)
}
}
}
struct SubView: View {
@EnvironmentObject var player: Player
var audioData: AudioData
var body: some View {
Text("Play or stop")
.onTapGesture {
player.play()
audioData.mutateAudioDataStruct()
}
}
}
为什么我在呼叫player.play()
时音频没有停止播放?我有stop()
功能,如果AVAudioPlayer正在播放音频,它显然不是零。
如果你想突变SwiftUIView
拥有的struct
,它应该是一个@State
变量——试图突变非@State
变量最多不会编译(编译器应该告诉你你是Cannot use mutating member on immutable value: 'self' is immutable
(,最坏的情况是(如果你找到了解决编译器错误的方法(,会导致意想不到的后果。
未来的读者,请参阅对原始问题的评论,以更详细地解释这个结论是如何得出的