如何从现有数组创建偶数新数组?

时间:2019-07-23 02:15:08

标签: swift

我正在尝试创建一个函数,该函数接受一个I​​nt数组,并返回一个原始数组中所有偶数的新数组。

我一直在摸索这段代码(我是一个非常新的初学者)

let numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
var newArray: [Int] = []

func newInt(newEven: Int, newArray: [Int]) -> Int {   
        for newEven in numberArray{
        var index = 0
        index += 1
        if newEven % 2 == 0 {
        newArray.insert(newEven, at:[index])
    }
    return newEven   
    } 
}

print(newArray)

4 个答案:

答案 0 :(得分:3)

这是一个好的开始!这里有一些指针:

1。格式化

格式化需要一些工作。通常,每个新作用域({ ... })都应引入新的缩进层,如下所示:

let numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
var newArray: [Int] = []

func newInt(newEven: Int, newArray: [Int]) -> Int {   
    for newEven in numberArray{
        var index = 0
        index += 1
        if newEven % 2 == 0 {
            newArray.insert(newEven, at:[index])
        }
        return newEven   
    } 
}

print(newArray)

现在我们可以进行一些观察:  1. index的作用域为for循环体,并且将始终具有相同的值0,然后是下一行之后的1。  2. return语句在for循环体内,并且是无条件的。此函数将始终返回numberArray的第一个元素的值  3.该函数的返回类型为Int。但是在您的问题中,您声明要让它返回所有偶数的数组。因此,您的返回类型必须为Array<Int>(又称[Int]),而不仅仅是Int

2。编译问题

此函数存在一些会阻止编译的错误:

  1. return语句位于循环体内。如果numberArray为空,并且从未输入for循环主体,那么您就不会点击return语句。一旦控制到达函数末尾,应返回什么值?没有定义,所以这是一个错误。在Swift中,通过函数的所有代码路径都必须返回一个值。 (Void函数除外,该函数在末尾隐式不返回任何内容)
  2. 您正在尝试使用第二个参数Array.insert(_:at:)调用[index],第二个参数是类型为Array<Int>的数组文字。应该只是index

3。逻辑问题

  1. 您的函数引入了一个名为newArray的参数,该参数在全局变量newArray之前的行上带有阴影。全局变量不是必需的,您应该将其删除。
  2. 您的函数在numberArray上运行,但是没有通过参数明确地将其用作输入。您不应使用参数来硬编码对诸如numberArray之类的全局变量的引用。
  3. 参数newEven未使用,并被for循环的局部变量所遮盖。
  4. 您的函数名称newInt(newEven:newArray:)没有描述函数的作用。考虑一个像func allEvens(in input: [Int]) -> [Int]
  5. 这样的函数签名
  6. 您从未真正调用过此函数。您声明了它,但从未告诉程序要运行它。
  7. 您不需要使用Array.insert(_:at:)。您可以简单地使用Array.append,它将自动将元素追加到数组的末尾。

4。建议

  1. 修复方法签名。您希望函数采用一些数字,并且仅输出偶数。用代码建模:func allEvens(in input: [Int]) -> [Int]
  2. 在本地(在函数内)创建一个新的空数组,偶数将存储在其中。在遍历input数组时,请检查每个数字是否偶数,如果是偶数,则将其附加到evens数组中。
  3. 返回evens数组。

答案 1 :(得分:0)

AddEventHandler("f:getPlayer", function(user, cb)
    if(Users and cb)then
        if(Users[user])then
            cb(Users[user])
        else
            cb(nil)
        end
    else
        cb(nil)
    end
end)

这应该返回一个带有偶数的新数组。

答案 2 :(得分:0)

正如LeoDabus在他的评论中提到的那样,您正在寻找的功能已经包含在Swift的标准库中,因此实际上并不需要编写专用的功能来完成该任务。这是您的操作方式:

let numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let newArray = numberArray.filter { $0.isMultiple(of: 2) }

print(newArray) // [2, 4, 6, 8, 10]

在这种情况下,您正在使用filter是否$0(其中$0是数组中的元素)是否是参数中指定数字的倍数,情况2。

您看到in the documentationisMultiple(of:)返回Booltruefalse)。这是签名:

func isMultiple(of other: Self) -> Bool

我建议您浏览this post,其中涉及mapfilterreduce的主题。从Swift入门时,这些都是有用的知识。

此外,我发现Dash在浏览Swift的文档时非常有帮助。

更新

我应该更彻底地阅读您的问题,因为我错过了您必须循环执行的部分。 Swift有一个很酷的方法,叫做forEach,我非常喜欢。使用该方法,将看起来像这样:

func filter(array: [Int], forMultiplesOf multiple: Int) -> [Int] {

    // Create a landing spot for whatever is a multiple...it starts as empty
    var newArray: [Int] = []

    // This is not the most compact way, but it satisfies the loop constraint
    array.forEach { number in
        if number % multiple == 0 {
            newArray.append(number)
        }
    }

    // Once you're done with the loop, then return the new array you declared at the beginning
    return newArray
}

您会这样称呼它:

let newArrayUsingFunction = filter(array: numberArray, forMultiplesOf: 2)

您在这里所做的是将2个参数传递给函数(数组和多个)以返回一个Ints数组。查看代码中的注释以了解发生了什么

答案 3 :(得分:-1)

很快,有太多方法可以存档此功能。请检查以下代码。

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

func newInt() -> [Int] {
    /**************************************
     If you want to use the index then, you can use Enumerated() function.
     It will return the index with the object at index.
     SO, you can use this function as follow

     for (index,number) in numberArray.enumerated(){
        print(index, Number)
     }
     ******************************************/
    var tempArr = [Int]()
    for number in numberArray{
        if number % 2 == 0 {
            tempArr.append(number)
        }
    }
    return tempArr
}

numberArray = newInt(Array: numberArray)
print(numberArray)