我正在尝试创建一个可以接受一个函数和一个Int(numberOfTimes)的函数,然后调用doFunctionXTimes()一定次数。但是,它只打印一次“Hello Ethan”(相对于5次)。这是我的代码:

func doFunctionXTimes(numberOfTimes: Int,function: Any) {
    for _ in 1...numberOfTimes {
       function
    }
}
func sayHello(name: String) {
    print("Hello \(name)")
}

doFunctionXTimes(5, function: sayHello("Ethan"))

//this code prints "Hello Ethan"

但是,如果在doFunctionXTimes()的for循环中将_更改为i,然后在我称为print(i)的上方或下方添加function语句,它将打印出从1到5的所有数字。被调用和打印print(i)语句的次数被多次调用。谢谢。这是我编辑的代码打印i。
func doFunctionXTimes(numberOfTimes: Int,function: Any) {
    for i in 1...numberOfTimes {
        print(i)
       function
        // or the print(i) statement can here. It does not affect the output.
    }
}
func sayHello(name: String) {
    print("Hello \(name)")
}

doFunctionXTimes(5, function: sayHello("Ethan"))

// this code prints out "Hello Ethan" and then 1 2 3 4 5

任何帮助或建议都很棒,希望对以后的观众有所帮助。

最佳答案

看下面的代码:

doFunctionXTimes(5, function: sayHello("Ethan"))
sayHello("Ethan")部分是一个函数调用。因此,当代码行运行时,它首先调用此函数-在输入doFunctionXTimes之前。然后在代码中,您将拥有:
function

这实际上并没有调用该函数(类似于将0单独放在一行上)。为了实现所需的功能,您需要一个闭包,该闭包将“包装”您要调用的函数:
func doFunctionXTimes(numberOfTimes: Int,function: (() -> Void)) {
    for _ in 1...numberOfTimes {
       function()
    }
}
func sayHello(name: String) {
    print("Hello \(name)")
}

doFunctionXTimes(5, function: { sayHello("Ethan") })

现在,函数以{ sayHello("Ethan") }的形式传递,直到调用该函数,才会调用sayHello

请注意,该函数现在定义为() -> Void,这意味着它是一个不带参数且不返回值的函数。 (我在定义周围加上了大括号,因为我发现它提高了清晰度)

关于ios - 具有麻烦的执行功能,但没有for循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36049053/

10-11 11:50