Eu estava codificando abaixo e me perguntei por que precisava do extra .00
em 70_000.00
. Sei que se não precisasse, seria considerado um inteiro.
protocol Building {
var rooms: Int { get }
var price: Double { get }
var retailer: String { get }
}
struct House: Building {
var rooms = 4
var price = 70_000.00
var retailer = "John Doe"
}
Achei que o Swift conseguiria inferir o tipo de dado em momentos como esse, principalmente quando eu já havia dito ao Swift que "Price" era um double.
Dos documentos :
Em outras palavras, para uma declaração de variável, a inferência de tipo é exclusivamente local para o que ela vê no lado direito da atribuição. Esse é o caso mesmo se o contexto em torno dessa atribuição faria com que ela inferisse um tipo diferente. Por exemplo:
O Swift nunca inferirá o tipo de
a
comoDouble
, porque o lado direito da atribuição é um literal inteiro — nesse caso, ele decide que o tipo mais apropriado éInt
; linhas antes ou depois da atribuição não entram em cena.O mesmo vale para
var price
: se você atribuir um literal inteiro, o Swift inferirá um tipo deInt
; atribuir um literal de ponto flutuante fará com que ele decida que esseDouble
é o tipo mais apropriado, o que coincidirá com o requisito do protocolo que você está tentando cumprir. Alternativamente, fornecervar price
um tipo explícito permitiria que você atribuísse um literal inteiro:var price: Double = 70_000
.Devido ao potencial de inferência inesperada de tipos, algumas diretrizes de estilo recomendam sempre dar tipos explícitos às variáveis de instância, para deixar bem claro qual deve ser o tipo esperado.