类型 '()' 不能符合 'View';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议

Posted

技术标签:

【中文标题】类型 \'()\' 不能符合 \'View\';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议【英文标题】:Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols calling calling functions with swift ui类型 '()' 不能符合 'View';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议 【发布时间】:2020-03-23 14:45:17 【问题描述】:

我有一个名为 MyWatchView 的 SwiftUI 视图和这个堆栈:

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)

我收到Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols 的错误,我认为这可能是我在 Swift 中的结构工作方式中不理解的问题。

【问题讨论】:

【参考方案1】:

您的 MyWatchView.self.playSound() 函数没有返回视图,因此您不能在 HStack 中使用它。

没有看到你的完整代码,我只能假设你想做什么,但这是我的猜测:如果状态变量 play 为真,你想执行 func playSound()?

你可以这样做:

@State private var play = false 
    willSet 
        if newValue 
            WKInterfaceDevice.current().play(.failure)
        
    

只要 State 变量 play 更改为 true,这将执行您的静态函数。

【讨论】:

@Asperi 如果您能指导我,我将不胜感激。它适用于我的测试应用程序。 :) 感谢您的回答,但我怎么能用这个功能做到这一点?我正在尝试使用计时器来触发播放声音功能。这是我的 ios 应用程序中的视图控制器类中的代码 timer = Timer.scheduledTimer(timeInterval: interval, target: click class, selector: #selector(clickClass.repeatSound), userInfo: clickClass, repeats: switchView.isOn)

以上是关于类型 '()' 不能符合 'View';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议的主要内容,如果未能解决你的问题,请参考以下文章

类型 '()' 不能符合 'View';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议

type() 不能符合 View;只有结构/枚举/类类型可以符合协议

“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”

使用 NavigationLink() 时出现“类型 '[view]' 不能符合 'View'”错误

协议类型不能符合协议,因为只有具体类型才能符合协议

类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议