如何创建一个返回另一个函数的函数(返回另一个函数等等)

时间:2014-12-21 01:04:07

标签: swift

我试图拥有一堆函数(没有输入参数),可选择返回同类的另一个函数,以实现类似的功能:

var next = f1
do {
    next = next()
} while next != nil

...

func f1() -> ????? {
    return f2
}

func f2() -> ????? {
    return f3
}

func f3() -> ????? {
    return nil
}

所以让函数返回将要使用的下一个函数。

问题是我似乎无法找到有效的函数签名/返回值的组合......

到目前为止,我发现的唯一方法是要求每个函数根据它返回的一个具有不同的签名,但是它会阻止将它存储在变量中,并且有任何逻辑来决定返回哪个函数...

1 个答案:

答案 0 :(得分:4)

您可以通过制作自己的OptionalFunc枚举来实现此目的:

enum OptionalFunc {        
   case Some(() -> OptionalFunc)
   case None

    var hasFunc: Bool {
        switch self {
            case .Some(_):
                return true
            case .None:
                return false
        }
    }

    func next() -> OptionalFunc {
        switch self {
            case .None:
                return .None
            case let .Some(block):
                return block()
        }
    }
}

然后您可以像这样定义您的功能:

func f3() -> OptionalFunc {
    println("3")
    return .None
}

func f2() -> OptionalFunc {
    println("2")
    return .Some(f3)
}

func f1() -> OptionalFunc {
    println("1")
    return .Some(f2)
}

像这样经历他们:

var next: OptionalFunc = .Some(f1)
while next.hasFunc {
    next = next.next()
}

全部放入游乐场,输出:

1
2
3