如何循环遍历包含 swift 中两个整数之间的所有数字的数组?

How do loop through an array that contains all numbers between two integers in swift?

我想做的是运行一个"fizzbizz"函数,使用从startend连续的任何整数数组,然后输出一个对象数组,整数或字符串,根据以下每种情况。

在此示例中,我试图 运行 数组上的函数,该函数从 start 整数 1 到 end 整数 15。

随着 fizzbuzz 函数的运行,对于该范围内的每个整数,我想检查它是否可以被 3 整除 and/or 5。如果它可以被 3 而不是 5 整除,我想 return"Fizz",如果不能被3整除但是被5整除,我要return"Buzz",以此类推。

我无法弄清楚如何设置 numsarray 以包含函数的两个输入 startend 之间的所有数字,我在那个数组中有什么下面是伪代码。当我用一组特定数字尝试它时,每个 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
        }
    }
}