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(

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(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”。这似乎有点奇怪。