Как получить количество указанного элемента c в многомерном массиве swift - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь получить количество указанного элемента c, когда его значение установлено в true. Является ли моя реализация права. Я получаю индекс ошибки вне диапазона, когда я пытаюсь заполнить выигрыш. значение счета в табличном представлении.

struct Game {
    var rivalGoal: String?
    var userGoal: String
    var win: Bool
}

var games: [Game?] = []
var weekLeagueObject: [[Game?]] = []

То, как я это сделал:

func winCountMethod (from games: [[Game?]], index: Int) -> Int {
    let win = games.filter({$0[index]?.win == true})
    return win.count
}

Ответы [ 3 ]

0 голосов
/ 23 марта 2020

Этот код сделает это:

func winCountMethod (from games: [[Game?]], index: Int) -> Int {
    return games[index].compactMap { $0?.win }.filter { $0 }.count
}
0 голосов
/ 23 марта 2020

Учитывая index как некоторые Int, вы можете использовать расширения, чтобы написать это так:

try weekLeagueObject.getElement(index: index).getCount(\.win)
public extension Collection {
  /// - Returns: same as subscript, if index is in bounds
  /// - Throws: CollectionIndexingError
  func getElement(index: Index) throws -> Element {
    guard indices.contains(index)
    else { throw CollectionIndexingError() }

    return self[index]
  }
}

public struct CollectionIndexingError: Error { }

public extension Sequence {
  func getCount<Wrapped>(
    _ getIsIncluded: (Wrapped) throws -> Bool
  ) rethrows -> Int?
  where Element == Wrapped? {
    try filter { try $0.map(getIsIncluded) == true }
      .count
  }
}
0 голосов
/ 23 марта 2020

Вы можете использовать метод массива reduce() для этого:

func getNumberOfWonGame() -> Int {
    games.reduce(0) { (result, game) in
        game.isWin ? result + 1 : result
    }
}

func getNumberOfWonGameShortened() -> Int {
    games.reduce(0) { $1.isWin ? $0 + 1 : $0 }
}

Для вашего конкретного примера это может быть:

func winCountMethod(from games: [[Game?]], index: Int) -> Int {
    games[index].reduce(0) { (result, game) in
        guard let game = game, !game.win else { return result }
        return result + 1
    }
}
...