web-dev-qa-db-ja.com

タイプ '()'は 'ビュー'に適合できません。プロトコルに準拠できるのは、構造体/列挙型/クラス型のみです。 SwiftUIで関数を呼び出す

私はSwiftこのスタックでMyWatchViewと呼ばれるUI構造体を持っています。

_        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)
}
_

タイプ '()'が '表示'に適合しないというエラーが発生します。プロトコルに準拠できるのは構造体/列挙型/クラス型のみです。これはおそらく、Swiftでの構造体の動作方法について理解していないものだと思います。タイマーを使用してサウンド再生機能をトリガーしようとしています。これは、iOSストーリーボードアプリtimer = Timer.scheduledTimer(timeInterval: interval, target: click class, selector: #selector(clickClass.repeatSound), userInfo: clickClass, repeats: switchView.isOn)のビューコントローラークラスのコードです。

3
Derick Mathews

あなたはこれをやっています:

if play
{
    MyWatchView.self.playSound()
}

Viewsのみが期待されるコンテキストで。関数の戻り値の型はVoid(または())、これがエラーが発生する理由です。


justToggleをクリックしたときにサウンドを再生する場合は、代わりに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()
}
1
Sam