如何循环遍历包含 swift 中两个整数之间的所有数字的数组?
How do loop through an array that contains all numbers between two integers in swift?
我想做的是运行一个"fizzbizz"函数,使用从start
到end
连续的任何整数数组,然后输出一个对象数组,整数或字符串,根据以下每种情况。
在此示例中,我试图 运行 数组上的函数,该函数从 start
整数 1 到 end
整数 15。
随着 fizzbuzz 函数的运行,对于该范围内的每个整数,我想检查它是否可以被 3 整除 and/or 5。如果它可以被 3 而不是 5 整除,我想 return"Fizz",如果不能被3整除但是被5整除,我要return"Buzz",以此类推。
我无法弄清楚如何设置 numsarray
以包含函数的两个输入 start
和 end
之间的所有数字,我在那个数组中有什么下面是伪代码。当我用一组特定数字尝试它时,每个 case
中的所有 return
都给我一个错误,指出我无法将该表达式转换为 [Any]
类型的表达式。
我使用 [Any]
是因为我会将整数和字符串都放入数组中,所以我不想将其设为一种特定类型。
func fizzinAndBuzzin(start: Int, end: Int) -> [Any]{
let numsarray = [start...end]
for number in numsarray {
switch (number % 3 == 0, number % 5 == 0) {
case (true, false):
return "Fizz"
case (false, true):
return "Buzz"
case (true, true):
return "FizzBuzz"
default:
return int(start)
}
}
}
fizzinAndBuzzin(1, 15)
您的函数的 return 类型是 [Any]
,它是 any 的数组。您不是 returning 数组,而是 returning 单个对象。像这样更改您的函数定义:
func fizzinAndBuzzin(start: Int, end: Int) -> Any {
然后你的代码就没有多大意义了。你的目标是return
[1,2,"fizz",4,"buzz","fizz",7,8,"fizz","buzz"]
等
如果是这样,那么您不想在每种情况下都使用 return,您想要构建一个数组:
func fizzinAndBuzzin(start: Int, end: Int) -> [Any]
{
//Create an empty array of Any
var numsArray = [Any]()
for number in start...end
{
switch (number % 3 == 0, number % 5 == 0) {
case (true, false):
numsArray.append("Fizz")
case (false, true):
numsArray.append("Buzz")
case (true, true):
numsArray.append("FizzBuzz")
default:
numsArray.append(number)
}
}
return numsArray
}
看来您的意图是构建一个在开始和结束之间包含 "Fizz Buzz values" 的数组。因此,考虑到这一点,我们不需要创建一个 let
数组,而是创建一个空的 var
数组并填充它。
我们的 switch
语句应该将值加载到这个数组中。但我实际上会在这里选择一些抽象,所以首先,一个函数只接受一个 Int
和 return 适当的值:
func fizzBuzzify(value: Int) -> Any {
switch (value % 3, value % 5) {
case (0, 0):
return "FizzBuzz"
case (0, _):
return "Fizz"
case (_, 0):
return "Buzz"
default:
return value
}
}
现在,让我们修复我们的 fizzinAndBuzzin
函数:
func fizzinAndBuzzin(start: Int, end: Int) -> [Any] {
var values = Array<Any>()
values.reserveCapacity(end-start+1)
for index in start...end {
values.append(fizzBuzzify(index))
}
return values
}
这种方法一次性预分配整个数组的内存(我们事先确切知道它有多大)。与依赖 .append
.
的方法相比,对于非常大的 start
-end
增量,这将产生非常明显的差异
map
函数正是为此目的而设计的,即获取一个数组,对每个元素应用一个闭包,然后从中创建一个新数组。例如:
let foo = [1, 2, 3]
let bar = foo.map { number -> Int in
return number * 2
}
这会将 bar
分配给:
[2, 4, 6]
因此,将 map
应用于您的原始问题,它看起来像:
func fizzinAndBuzzin(start: Int, end: Int) -> [Any] {
let numsarray = Array(start ... end)
return numsarray.map() { number -> Any in
switch (number % 3 == 0, number % 5 == 0) {
case (true, false):
return "Fizz"
case (false, true):
return "Buzz"
case (true, true):
return "FizzBuzz"
default:
return number
}
}
}
我想做的是运行一个"fizzbizz"函数,使用从start
到end
连续的任何整数数组,然后输出一个对象数组,整数或字符串,根据以下每种情况。
在此示例中,我试图 运行 数组上的函数,该函数从 start
整数 1 到 end
整数 15。
随着 fizzbuzz 函数的运行,对于该范围内的每个整数,我想检查它是否可以被 3 整除 and/or 5。如果它可以被 3 而不是 5 整除,我想 return"Fizz",如果不能被3整除但是被5整除,我要return"Buzz",以此类推。
我无法弄清楚如何设置 numsarray
以包含函数的两个输入 start
和 end
之间的所有数字,我在那个数组中有什么下面是伪代码。当我用一组特定数字尝试它时,每个 case
中的所有 return
都给我一个错误,指出我无法将该表达式转换为 [Any]
类型的表达式。
我使用 [Any]
是因为我会将整数和字符串都放入数组中,所以我不想将其设为一种特定类型。
func fizzinAndBuzzin(start: Int, end: Int) -> [Any]{
let numsarray = [start...end]
for number in numsarray {
switch (number % 3 == 0, number % 5 == 0) {
case (true, false):
return "Fizz"
case (false, true):
return "Buzz"
case (true, true):
return "FizzBuzz"
default:
return int(start)
}
}
}
fizzinAndBuzzin(1, 15)
您的函数的 return 类型是 [Any]
,它是 any 的数组。您不是 returning 数组,而是 returning 单个对象。像这样更改您的函数定义:
func fizzinAndBuzzin(start: Int, end: Int) -> Any {
然后你的代码就没有多大意义了。你的目标是return
[1,2,"fizz",4,"buzz","fizz",7,8,"fizz","buzz"]
等
如果是这样,那么您不想在每种情况下都使用 return,您想要构建一个数组:
func fizzinAndBuzzin(start: Int, end: Int) -> [Any]
{
//Create an empty array of Any
var numsArray = [Any]()
for number in start...end
{
switch (number % 3 == 0, number % 5 == 0) {
case (true, false):
numsArray.append("Fizz")
case (false, true):
numsArray.append("Buzz")
case (true, true):
numsArray.append("FizzBuzz")
default:
numsArray.append(number)
}
}
return numsArray
}
看来您的意图是构建一个在开始和结束之间包含 "Fizz Buzz values" 的数组。因此,考虑到这一点,我们不需要创建一个 let
数组,而是创建一个空的 var
数组并填充它。
我们的 switch
语句应该将值加载到这个数组中。但我实际上会在这里选择一些抽象,所以首先,一个函数只接受一个 Int
和 return 适当的值:
func fizzBuzzify(value: Int) -> Any {
switch (value % 3, value % 5) {
case (0, 0):
return "FizzBuzz"
case (0, _):
return "Fizz"
case (_, 0):
return "Buzz"
default:
return value
}
}
现在,让我们修复我们的 fizzinAndBuzzin
函数:
func fizzinAndBuzzin(start: Int, end: Int) -> [Any] {
var values = Array<Any>()
values.reserveCapacity(end-start+1)
for index in start...end {
values.append(fizzBuzzify(index))
}
return values
}
这种方法一次性预分配整个数组的内存(我们事先确切知道它有多大)。与依赖 .append
.
start
-end
增量,这将产生非常明显的差异
map
函数正是为此目的而设计的,即获取一个数组,对每个元素应用一个闭包,然后从中创建一个新数组。例如:
let foo = [1, 2, 3]
let bar = foo.map { number -> Int in
return number * 2
}
这会将 bar
分配给:
[2, 4, 6]
因此,将 map
应用于您的原始问题,它看起来像:
func fizzinAndBuzzin(start: Int, end: Int) -> [Any] {
let numsarray = Array(start ... end)
return numsarray.map() { number -> Any in
switch (number % 3 == 0, number % 5 == 0) {
case (true, false):
return "Fizz"
case (false, true):
return "Buzz"
case (true, true):
return "FizzBuzz"
default:
return number
}
}
}