情景复现
在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)
因此,后续在传参时要匹配视图的声明顺序。