Тип '()' не может соответствовать 'View'; только типы struct / enum / class могут соответствовать протоколам; вызов функций с помощью SwiftUI - PullRequest
1 голос
/ 28 марта 2020

У меня есть структура Swift UI под названием MyWatchView с этим стеком.

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


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

Он также имеет @State private var play = false; И функция playSound выглядит следующим образом:

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

Я получаю сообщение об ошибке типа '()', которое не может соответствовать 'View'; только типы struct / enum / class могут соответствовать протоколам. Я думаю, что это, вероятно, то, что я не понимаю в том, как структуры работают в Swift. Я пытаюсь использовать таймер для запуска функции воспроизведения звука. Это мой код в моем классе View Controller из моего iOS приложения раскадровки timer = Timer.scheduledTimer(timeInterval: interval, target: click class, selector: #selector(clickClass.repeatSound), userInfo: clickClass, repeats: switchView.isOn)

1 Ответ

0 голосов
/ 29 марта 2020

Вы делаете это:

if play
{
    MyWatchView.self.playSound()
}

в контексте, где ожидаются только View s. Тип возврата функции - Void (или ()), поэтому вы получаете сообщение об ошибке.


Если вы хотите, чтобы просто воспроизводил звук, когда вы нажимаете Toggle, вы, вероятно, хотите использовать вместо него Button:

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

Если вы хотите Toggle (например, для обновления переменной Bool), вы можете сделать это :

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