Swift-style-guide: Inconsistencia al inicializar matrices y diccionarios vacíos

Creado en 7 abr. 2017  ·  4Comentarios  ·  Fuente: raywenderlich/swift-style-guide

Tendría que decir que estoy de acuerdo con la mayor parte de lo que se indica en las pautas, pero esta parece inconsistente:

https://github.com/raywenderlich/swift-style-guide#type -annotation-for-empty-arrays-and-dictionary

La guía indica:

// preferred
var names: [String] = []
var lookup: [String: Int] = [:]

se prefiere sobre

// not preferred
var names = [String]()
var lookup = [String: Int]()

Pero la guía generalmente prefiere tipos inferidos en aras del código compacto:

// preferred
let message = "Click the button"
let currentBounds = computeViewBounds()

`` rápido
// no preferido
let message: String = "Haga clic en el botón"
dejar currentBounds: CGRect = computeViewBounds ()

If we were being consistent, shouldn't we always prefer inferred types over explicit declaration?  I would think this is more consistent
```swift
// should be preferred
var names = [String]();
var lookup = [String: Int]();

Comentario más útil

En mi opinión, la guía es correcta aquí. Simplemente dice, cuando sea necesario, especifique el tipo. Cuando no, déjelo.

Ok, pero ¿no es esto realmente una elección de estilo? No en realidad no. Echemos un vistazo a algunos ejemplos:

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red, .green, .blue]

Ahora, convierta esos 3 ejemplos en su preferencia sugerida.

var colors: [UIColor]?
var colors = [UIColor]()
var colors = [UIColor.red, UIColor.green, UIColor.blue]

¿Ves lo que pasó allí? Para la última fila, ahora necesitamos repetir UIColor para cada elemento de la matriz. También puede argumentar que las declaraciones ahora son menos coherentes entre sí.

¿Qué tal un método entonces? Bueno, por supuesto, puede optar por especificar siempre el tipo en aras de la coherencia. Sin embargo, me imagino que la mayoría de los desarrolladores querrían eliminar el código redundante.

// do we need to specify type?
var colors: [UIColor] = rainbowColors()
// no we don't
var colors = rainbowColors()

¿Tiene sentido?

_Editar: Para ser justos, también podría inferir una matriz como esta, pero dado que estamos hablando de consistencia, estoy considerando esta fuera de la mesa. Solo pensé que estaría en lo correcto_

// preferred
var colors: [UIColor] = [.red, .green, .blue]
// not preferred
var colors = [.red, UIColor.green, .blue]

Todos 4 comentarios

En mi opinión, la guía es correcta aquí. Simplemente dice, cuando sea necesario, especifique el tipo. Cuando no, déjelo.

Ok, pero ¿no es esto realmente una elección de estilo? No en realidad no. Echemos un vistazo a algunos ejemplos:

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red, .green, .blue]

Ahora, convierta esos 3 ejemplos en su preferencia sugerida.

var colors: [UIColor]?
var colors = [UIColor]()
var colors = [UIColor.red, UIColor.green, UIColor.blue]

¿Ves lo que pasó allí? Para la última fila, ahora necesitamos repetir UIColor para cada elemento de la matriz. También puede argumentar que las declaraciones ahora son menos coherentes entre sí.

¿Qué tal un método entonces? Bueno, por supuesto, puede optar por especificar siempre el tipo en aras de la coherencia. Sin embargo, me imagino que la mayoría de los desarrolladores querrían eliminar el código redundante.

// do we need to specify type?
var colors: [UIColor] = rainbowColors()
// no we don't
var colors = rainbowColors()

¿Tiene sentido?

_Editar: Para ser justos, también podría inferir una matriz como esta, pero dado que estamos hablando de consistencia, estoy considerando esta fuera de la mesa. Solo pensé que estaría en lo correcto_

// preferred
var colors: [UIColor] = [.red, .green, .blue]
// not preferred
var colors = [.red, UIColor.green, .blue]

Me hubiera ido con

var colors: [UIColor]?
var colors = [UIColor]()
var colors: [UIColor] = [.red, .green, .blue]

En lugar de lo que hiciste arriba. ¿No preferimos usar el tipo inferido excepto cuando se requiere una declaración explícita? En ese sentido, la tercera línea parece consistente.

Tiene razón en el sentido de que probablemente simplifiqué demasiado la regla. Dicho esto, no hay nada de malo en ninguno de los enfoques, solo se reduce a las preferencias. En mi caso, considero que lo siguiente es más coherente, más legible y más práctico al ir y venir de estados vacíos / no vacíos. Creo que deberíamos dejar que otros intervengan.

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red]
// not preferred (in my opinion)
var colors: [UIColor]?
var colors = [UIColor]()
var colors: [UIColor] = [.red]

El problema que tienes con eso es esta inconsistencia:

// inconsistent?
var colors: [UIColor] = []
var colors = rainbowColors()
// your preference
var colors = [UIColor]()
var colors = rainbowColors()

@RobertGummesson , solo está tomando en consideración los tipos que se usan más con la sintaxis literal de matriz / diccionario. Si solo tuviéramos matrices para poblar con matrices literales, ambas soluciones estarían bien. Incluso solía usar lo que sugieres. Pero luego obtuvimos sets y tuve que estandarizar una convención que los incluyera también. El que está sugiriendo es más feo que escribir explícitamente.

var ints: Set = [1, 1, 2, 2]
var ints = Set([1, 1, 2, 2])
var ints = Set(arrayLiteral: 1, 1, 2, 2)

Por lo tanto, después de decidirse por que la opción superior sea mejor para conjuntos no vacíos, una versión vacía y las convenciones de matriz para que coincidan, se pueden volver a formar.

var ints: Set<Int> = []
var ints = Set<Int>() // instead of this, which, without the above, seems fine.

var ints = [1, 1, 2, 2]
var ints: [Int] = []
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

ghost picture ghost  ·  26Comentarios

rayfix picture rayfix  ·  3Comentarios

luki picture luki  ·  3Comentarios

aramezk picture aramezk  ·  9Comentarios

fabienwarniez picture fabienwarniez  ·  9Comentarios