Как переопределить класс с наборами вместо массивов в Swift - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь перестроить класс Colony, который я написал для «Игры жизни» Конвея с наборами вместо массивов, но у меня возникают проблемы при этом.Вот что я получил до сих пор: PS Я предполагаю фиксированный размер колонии 20х20.

import Foundation
struct Array2DB {
    var values: [Int]
    var rows: Int
    var cols: Int
    init(rows: Int, cols: Int){
        self.rows = rows
        self.cols = cols
        values = [Int](repeating: 0, count: (rows + 2) * (cols + 2) )
    }
    //allows uasge of the syntax [row, col] for get/set access
    subscript(row:Int, col: Int) -> Int {
        get {
            return values[getIndex(row, col)]
        }
        set(val) {
            values[getIndex(row, col)] = val
        }
    }
    //converts 2D indices to index in data (terminates if out of bounds)
    func getIndex(_ row: Int, _ col: Int) -> Int {
        assert((row >= -1) && (row <= rows), "row \(row) is out of bounds")
        assert((col >= -1) && (col <= cols), "col \(col) is out of bounds")
        return (row + 1) * cols + col + 1
    }
    var description: String {
        var desc = "Matrix:\n"
        for row in 0 ..< rows {
            for col in 0 ..< cols {
                desc += "  \(values[getIndex(row, col)])  "
            }
            desc += "\n"
        }
        return desc
    }
}

class Colony: CustomStringConvertible {
    let colony: Set = Array2DB[rows, cols, values]

    func setCellAlive(xCoor: Int, yCoor: Int) {
        colony[xCoor, yCoor] = 1
    }
    func setCellDead(xCoor:Int, yCoor: Int) {
        colony[xCoor, yCoor] = 0
    }
    func resetColony() {
        for i in 0..<colony.rows {
            for e in 0..<colony.cols {
                colony[i, e] = 0
            }
        }

    }
    var description: String {
        var desc = ""
        for i in 0..<colony.rows {
            for e in 0..<colony.cols {
                if colony[i, e] == 1 {
                    desc += "*"
                } else {
                    desc += "-"
                }
            }
            desc += "\n"
        }
        return desc
    }
    func isCellALive( xCoor: Int, yCoor: Int) -> Bool{
        return colony[xCoor, yCoor] == 1
    }
    func evolve() {
        var colonyUpdate: Array2DB = colony
        for i in 0..<colony.rows {
            for e in 0..<colony.cols {
                let cGen = rules(xCoor: i, yCoor: e)
                if ((cGen < 2) || (cGen > 3)) {
                    colonyUpdate[i, e] = 0
                } else if cGen == 3 {
                    colonyUpdate[i, e] = 1
                } else {
                    if colony[i, e] == 1 {
                        colonyUpdate[i, e] = 1
                    } else {
                        colonyUpdate[i, e] = 0
                    }
                }
            }
        }
        colony = colonyUpdate
    }
}

Я уверен, что я неправильно это реализовал, но как мне превратить массивы в наборы?Я действительно запутался и был бы признателен за любые рекомендации или feedbac

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Очень небольшая помощь для вас, чтобы показать пример использования Set в Game of Life.

struct Cell: Hashable {
    var x: Int
    var y: Int
}

class Colony: CustomStringConvertible {
    var aliveCells: Set = Set<Cell>()

    let numberOfRows: Int
    let numberOfColumns: Int

    init(colonySize: Int) {
        self.numberOfRows = colonySize
        self.numberOfColumns = colonySize
    }

    func setCellAlive(xCoor: Int, yCoor: Int) {
        aliveCells.insert(Cell(x: xCoor, y: yCoor))
    }
    func setCellDead(xCoor:Int, yCoor: Int) {
        aliveCells.remove(Cell(x: xCoor, y: yCoor))
    }
    func resetColony() {
        aliveCells.removeAll(keepingCapacity: true)
    }
    var description: String {
        var desc = ""
        for i in 0..<numberOfRows {
            for e in 0..<numberOfColumns {
                if aliveCells.contains(Cell(x: e, y: i)) { //Usually `x` represents column, and `y` for row
                    desc += "*"
                } else {
                    desc += "-"
                }
            }
            desc += "\n"
        }
        return desc
    }

    //Implement other methods you need
    //...
}

Как уже отмечалось, Set не является хорошим типом данных для Game of Life.Но вы можете реализовать это, используя Set.Удачи.

0 голосов
/ 19 сентября 2018

Ваш тип данных Array2DB не является Array.Это Struct, что содержит массив.Вы не можете присвоить Array2DB переменной, которую вы объявили типа Set.Это не сработает.

Вы также не можете использовать Set в качестве хранилища для игры жизни Конвея.Тип данных Swift Set представляет собой неупорядоченную коллекцию.Это не подходит для хранения данных в игре жизни.Вы хотите массив, точка.

...