Нельзя использовать мутирующий член в неизменяемом значении: «self» является неизменным в SwiftUI - PullRequest
0 голосов
/ 28 сентября 2019

Для следующего кода я получаю следующую ошибку.Я не знаю, как обойти это.Как я могу позвонить 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")
    }
}

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Вы пытаетесь настроить плеер на новый объект в volumeCheck ().Установите плеер в инициализаторе:

struct ContentView: View {

    private var player: AVAudioPlayer?

    public init() {
        if let url = Bundle.main.url(forResource: "chimes",
                                     withExtension: "mp3") {
            self.player = try? AVAudioPlayer(contentsOf: url)
        }
    }

    var body: some View {
        HStack {
            Button("Click to test chimes volume") {
                self.volumeCheck()
                }   .disabled(player == nil)
        }
    }

    private func volumeCheck() {
        player?.prepareToPlay()
        player?.volume = Float(self.sliderValue)
        player?.play()
        print("volume checked print")
    }
}

Обратите внимание, что вы используете sliderValue в своем коде, даже если он нигде не определен.

0 голосов
/ 28 сентября 2019

Проблема в том, что View - это struct, а его поле body - это вычисляемое свойство с немутирующим геттером.В вашем коде случается мутирующий метод, вызываемый в этом немутирующем геттере.Так что все, что вам нужно сделать, это установить проигрыватель на какую-нибудь модель:

class Model {
    var player: AVPlayerPlayer()
}

struct ContentView: View {

    var model = Model()

    // player can be changed from anywhere
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...