仅当条件在 swift 中匹配时,如何一个接一个地调用转义函数?

问题描述

func conditionalCalling() {

if 1==1 {
    hitFirstAPI {
        if 2==2 {
            hitSecondAPI {
                if 3==3 {
                    hitThirdAPI {
                    }
                }
            }
        }
        else if 3==3 {
            hitThirdAPI {
                
            }
        }
    }
}
else if 2==2 {
    hitSecondAPI {
        if 3==3 {
            hitThirdAPI {
                
            }
        }
    }
    
}
else if 3==3 {
    hitThirdAPI {
        
    }
}

}


    func hitFirstAPI(done: @escaping ()->Void) {
        
    }
    func hitSecondAPI(done: @escaping ()->Void) {
        
    }
    func hitThirdAPI(done: @escaping ()->Void) {
        
    }

上面的代码简单地说明了我的问题,简单来说,如果条件匹配我想一个一个调用函数 strong> 如果不检查下一个条件,如果这是真的调用一个函数等等......

我怎样才能以最少的代码行做到这一点?

我最初的想法:

func conditionalCaling() {
    if 1==1 {
        hitFirstAPI {
            
        }
    }
    if 2==2 {
        hitSecondAPI {
            
        }
    }
    if 3==3 {
        hitThirdAPI {
            
        }
    }
}

虽然这种方法只会在条件匹配时调用函数,但它会一起调用所有函数NOT一个函数逃脱闭包块之后。

最顶层的代码似乎是解决方案,但我想用最少的代码行来做到这一点,还有其他比 if else 语句更好的方法吗??

解决方法

您可以将您的第一次尝试重构为更小的合理的块。

import Foundation

func conditionalCalling() {
    initiateFlow {
        print("Done!")
    }
}
func initiateFlow(done: @escaping ()->Void) {
    if 1==1 {
        hitFirstAPI { initiateSecondAPI(done: done) }
    } else {
        initiateSecondAPI(done: done)
    }
}
func initiateSecondAPI(done: @escaping ()->Void) {
    if 2==2 {
        hitSecondAPI { initiateThirdAPI(done: done) }
    } else {
        initiateThirdAPI(done: done)
    }
}
func initiateThirdAPI(done: @escaping ()->Void) {
    if 3==3 {
        hitThirdAPI(done: done)
    } else {
        done()
    }
}
func hitFirstAPI(done: @escaping ()->Void) {}
func hitSecondAPI(done: @escaping ()->Void) {}
func hitThirdAPI(done: @escaping ()->Void) {}

在上述方法中,您的检查不会不必要地重复,并且它仍然可以在您的第一次尝试中执行您想要的操作(原始流程)。