我正在尝试创建一个可以接受函数和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
任何帮助或建议都很棒,我希望这有助于未来的观众。
答案 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次,依此类推。