Home > Blockchain >  Re-write in a more Swift-friendly way
Re-write in a more Swift-friendly way

Time:11-13

Given an array of optional integers, I count the values which are not nil, up to (and including) a given index. I wrote the code down below. Is there another way to get the same result? A more Swift-friendly way?

Here is my code:

func getValuesCount(upTo index: Int, in values: [Int?]) -> Int {
  return values[0 ... index].filter { value in return value != nil }.count
}

CodePudding user response:

One slightly more streamlined approach would be to use compactMap instead of explicitly checking values for nil. And prefix can be used to get the first n values, even if the passed in index if larger than the array. And the return is optional when there’s a one line result of the proper type.

func getValuesCount(upTo index: Int, in values: [Int?]) -> Int {
    values.prefix(index).compactMap { $0 }.count
}

With the parameter name upTo it implies that the range should be ..<index instead of ...index. So the use of prefix(index) is similar to using ..<index. If you want to include index then you probably want prefix(index 1).

  • Related