Swift中无前向函数声明的协递归
Swift没有用于前向函数声明的机制(据我所知),所以我想知道如何定义简单的协递归函数。例如,用于绘制的简单方案可以使用以下协递归函数Swift中无前向函数声明的协递归,swift,recursion,forward-declaration,Swift,Recursion,Forward Declaration,Swift没有用于前向函数声明的机制(据我所知),所以我想知道如何定义简单的协递归函数。例如,用于绘制的简单方案可以使用以下协递归函数X和Y: func dragon(levels : Int) { func X(_ d : Int) { // call's Y() if d > 0 { X(d - 1) turn(90) Y(d - 1) drawForward() turn(
X
和Y
:
func dragon(levels : Int) {
func X(_ d : Int) { // call's Y()
if d > 0 {
X(d - 1)
turn(90)
Y(d - 1)
drawForward()
turn(90)
}
}
func Y(_ d : Int) { // calls X()
if d > 0 {
turn(-90)
drawForward()
X(d - 1)
turn(-90)
Y(d - 1)
}
}
drawForward() // put these two statements above the definition
X(levels) // of 'X' and you get "use of 'X' before definition
} // error."
我想我可以用协议来解决这个问题。但是,如果Swift中没有转发声明或不完整的类型,您如何解决这个鸡和蛋的问题呢
编辑:上面的代码是可以的,但是如果移动底部调用X(levels)
,那么
它发生在定义X
之前,您会收到错误“使用
局部变量“X”在其声明之前”。这似乎很奇怪
由于您正在定义dragon
和X(级别)
实际上不会
调用直到稍后(当实际调用
dragon
时)。在Swift 3.1中为我编译得很好(在为drawForward
和turn
添加存根之后)。与C不同,Swift不需要以任何特定顺序进行声明。你可以不用做任何特别的事情就使用你写的东西。。。Xcode告诉我“在is声明之前使用局部变量‘Y’。@wcochran您使用的是哪个版本的Swift?@Hamish--Swift 3.1。我发现,您实际上无法调用尚未定义的函数——例如,如果您移动dragon
函数中的最后两条语句,使它们出现在X
和'Y'的定义之前,则会出现错误“在声明前使用局部变量'X'。这似乎有点奇怪。在Swift 3.1中编译对我来说很好(在为drawForward
和turn
添加存根之后)。与C不同,Swift不需要以任何特定顺序声明。你可以不用做任何特别的事情就使用你写的东西。。。Xcode告诉我“在is声明之前使用局部变量‘Y’。@wcochran您使用的是哪个版本的Swift?@Hamish--Swift 3.1。我发现你实际上不能调用一个还没有定义的函数——例如,如果你移动dragon
函数中的最后两条语句,使它们出现在X
和'Y'的定义之前,那么你会得到一个错误“在声明之前使用局部变量'X”。这似乎有点奇怪。