web-dev-qa-db-fra.com

Le type '()' ne peut pas être conforme à 'View'; seuls les types struct / enum / class peuvent se conformer aux protocoles; appel de fonctions avec SwiftUI

J'ai une structure d'interface utilisateur Swift appelée MyWatchView avec cette pile.

        VStack (alignment: .center)
        {
            HStack
            {
                Toggle(isOn: $play)
                {
                    Text("")


                }
                .padding(.trailing, 30.0)
                .hueRotation(Angle.degrees(45))
                if play
                {
                    MyWatchView.self.playSound()
                }
            }
        }

Il a également @State private var play = false; Et une fonction playSound comme ceci:

static private func playSound()
{
    WKInterfaceDevice.current().play(.failure)
}

J'obtiens une erreur de type '()' ne peut pas être conforme à 'View'; seuls les types struct/enum/class peuvent se conformer aux protocoles. Je pense que c'est probablement quelque chose que je ne comprends pas dans la façon dont les structs fonctionnent dans Swift. J'essaie d'utiliser une minuterie pour déclencher la fonction de lecture du son. Ceci est mon code dans ma classe View Controller depuis mon application de storyboard iOS timer = Timer.scheduledTimer(timeInterval: interval, target: click class, selector: #selector(clickClass.repeatSound), userInfo: clickClass, repeats: switchView.isOn)

3
Derick Mathews

Vous faites ceci:

if play
{
    MyWatchView.self.playSound()
}

dans un contexte où seuls Views sont attendus. Le type de retour de la fonction est Void (ou ()), c'est pourquoi vous obtenez l'erreur.


Si vous voulez juste jouer un son lorsque vous cliquez sur Toggle, vous voudrez probablement utiliser un Button à la place:

Button(action: {
    MyWatchView.self.playSound()
}) {
    Text("")
}

Si vous voulez un Toggle (par exemple, pour mettre à jour une variable Bool), vous pouvez le faire:

Toggle(isOn: $play)
{
    Text("")
}
.padding(.trailing, 30.0)
.hueRotation(Angle.degrees(45))
.onTapGesture {
    MyWatchView.self.playSound()
}
1
Sam