SwiftUI报错“Argument * must precede argument * Replace * with *”
SwiftUI报错“Argument * must precede argument * Replace * with *”

SwiftUI报错“Argument * must precede argument * Replace * with *”

情景复现

在SwiftUI操作时,发现存在“SwiftUI报错“Argument * must precede argument * Replace * with *”类似的报错,具体的报错为:

Argument 'randomGestureFunc' must precede argument 'resultDelay'
Replace 'resultDelay: 3, randomGestureFunc: RandomGestures' with 'randomGestureFunc: RandomGestures, resultDelay: 3'

解决方案为,可以点击右侧的“Fix”按钮,Xcode会自动调整代码入参的顺序。

问题分析

这个问题的报错原因是,SwiftUI 在初始化视图时,传递的参数顺序必须与视图的构造函数参数声明顺序一致。

例如本次的报错代码为:

Judge(Steps: $Step,CurrentGesture: $CurrentGesture, RandomGesture: $RandomGesture, gesture: $gesture, WinOrLose: $WinOrLose, resultDelay: 3, randomGestureFunc: RandomGestures)

struct Judge: View {
    @Binding var Steps: Int
    @Binding var CurrentGesture: Int
    @Binding var RandomGesture: Int
    @Binding var gesture: [String]
    @Binding var WinOrLose: Int
    var randomGestureFunc: () -> Void
    var resultDelay: TimeInterval
    ... 
}

根据上面的代码可以了解到,resultDelay在Judge视图中的声明顺序是最后一位。因此,在传参时,也必须按照找个顺序传参。

正确的传参代码为:

Judge(Steps: $Step,CurrentGesture: $CurrentGesture, RandomGesture: $RandomGesture, gesture: $gesture, WinOrLose: $WinOrLose, randomGestureFunc: RandomGestures, resultDelay: 3)

因此,后续在传参时要匹配视图的声明顺序。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注