麻烦执行功能而不是循环它是在

时间:2016-03-16 23:40:44

标签: ios swift

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

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

任何帮助或建议都很棒,我希望这有助于未来的观众。

2 个答案:

答案 0 :(得分:3)

查看以下代码:

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,这意味着它是一个不带参数且不返回任何值的函数。 (我在定义周围添加了额外的括号,因为我发现它提高了清晰度)

答案 1 :(得分:1)

您也可以对其进行设置,以便只需重复设置该函数的var就可以添加重复的次数。

func sayHello(name: String)
{
    print("Hello \(name)")
}

func repeatDoFunctionXTimes(number: Int, forFunction function:(()-> Void))-> (() ->Int) {

    var runFor =  number
    var i = 0;

    func repeater() -> Int  {


        while i < runFor {
            print(i)
            function()
            i++
        }
         runFor += 1
        return runFor

    }

    return repeater
}

var repeatFive = repeatDoFunctionXTimes(5,  forFunction: {sayHello("Ethan")})

repeatFive()

如果再次输入repeatFive(),它将打印6次,依此类推。