es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Subíndice Swift con tipo de dato genérico.

Estoy intentando programar una estructura de almacenamiento de datos bidimensional para varios tipos de datos. Sin embargo, estoy teniendo problemas con el subíndice para establecer los datos debido a errores de tipo ‘Cannot assign value of type ‘T’ to subscript of type ‘T’. ¡Cualquier ayuda es muy apreciada!

“`
struct dataMatrix<t>: Sequence, IteratorProtocol {
var rows: Int, columns: Int
var data: [T]
var position = 0

<pre><code>init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
data = Array<t>()
}

func valueAt(column: Int, row: Int) -> T? {
guard column >= 0 && row >= 0 && column < columns else {
return nil
}

let indexcolumn = column + row * columns

guard indexcolumn < data.count else {
return nil
}

return data[indexcolumn]
}

subscript<t>(column: Int, row: Int) -> T? {
get {
return valueAt(column: column, row: row) as? T
}
set {
data[(column * row) + column] = newValue as! T // no compila
}
}

// métodos del protocolo secuencia iterador
mutating func next() -> String? {
if position <= data.count {
print(position)
defer { position += 1 }
return "\(position)"
} else {
defer { position = 0 }
return nil
}
}
</code></pre>

}
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el subíndice es que tiene un parámetro de tipo genérico <t> que choca con el parámetro de tipo genérico de la estructura. Para solucionar esto, elimine el parámetro de tipo genérico <t> de la declaración del subíndice.

    Además, el setter para el subíndice también intenta convertir incorrectamente newValue al tipo T, lo cual es innecesario ya que newValue ya es de tipo T. Simplemente asigne newValue a data en el índice correcto.

    Aquí está el código actualizado para el subíndice:

    subscript(column: Int, row: Int) -> T? {
        get {
            return valueAt(column: column, row: row)
        }
        set {
            guard let newValue = newValue else {
                return
            }
            data[(row * columns) + column] = newValue
        }
    }
    

    Con estos cambios, ahora debería poder establecer datos en la matriz bidimensional utilizando el subíndice sin encontrar errores de tipo.

Comments are closed.