首页 > 解决方案 > 不能在不可变值上使用变异成员:'self' 在 SwiftUI 中是不可变的

问题描述

对于以下代码,我收到以下错误。我不知道如何解决这个问题。如何volumeCheck()在按钮单击时调用?

struct ContentView: View {

    var player = AVAudioPlayer()

    var body: some View {
        HStack {
            Button(action: {
                self.volumeCheck()
            }) {
                Text("Click to test chimes volume")
            }
        }
    }

    mutating func volumeCheck() {
        guard let url = Bundle.main.url(
            forResource: "chimes",
            withExtension: "mp3"
            ) else { return }

        do {
            player = try AVAudioPlayer(contentsOf: url)
            player.prepareToPlay()
            player.volume = Float(self.sliderValue)
            player.play()
        } catch let error {
            print(error.localizedDescription)
        }
        print("volume checked print")
    }
}

标签: swiftui

解决方案


问题是它View是 astruct并且它的body字段是具有非可变 getter 的计算属性。在您的代码中,它会在该非变异 getter 中调用变异方法。所以你需要做的就是把你的播放器放到某种模型上:

class Model {
    var player: AVPlayerPlayer()
}

struct ContentView: View {

    var model = Model()

    // player can be changed from anywhere
}

PS 在某些其他情况下,您可能希望模型中的更改反映在视图中,因此您必须在模型声明之前添加@ObservedObject。

希望有帮助


推荐阅读