o que é T. Type em swift
alguém me pode dizer o que é T.Type
Quando eu uso JSONDecoder().descodificar ()?
acho que é tipo de descodificar dados que eu codificei
tantos exemplos usam o método acima como este
JSONEncoder().decode([People].self, from: data) ...
se verificar a definição desse método, consigo ver T.Type
.
T.Type
Qual é a diferença entre o Tipo T E T.
Quando declaramos algumas variáveis, atribuímos os seus tipos assim
var someValue: Int
, não var someValue: Int.self
Qual é o T.Type
exactamente e Type.self
1 answers
-
T.Type
é usado em parâmetros e restrições para significar "o tipo da coisa em si, não uma instância da coisa".Por exemplo:
class Example { static var staticVar: String { return "Foo" } var instanceVar: String { return "Bar" } } func printVar(from example: Example) { print(example.instanceVar) // "Bar" print(example.staticVar) // Doesn't compile, _Instances_ of Example don't have the property "staticVar" } func printVar(from example: Example.Type) { print(example.instanceVar) // Doesn't compile, the _Type_ Example doesn't have the property "instanceVar" print(example.staticVar) // prints "Foo" }
Obtém-se uma referência a um tipo
.Type
(o objecto do tipo em si) no tempo de execução chamandoTheType.self
. A sintaxeTheType.Type
é usada em declarações de tipo e assinaturas de tipo apenas para indicar ao compilador a distinção de instância vs. tipo. Você não pode realmente obter uma referência a, por exemplo,Int
' s escreva em tempo de execução ou nas implementações das suas funções chamandoInt.Type
. Você ligaria.Int.self
No código de exemplo
var someValue: Int
, a notação específicaidentifier: Type
(neste caso,someValue: Int
) significa que someValue será uma instânciade Int. Se você quisesse que o someValue fosse uma referência ao tipo real Int, você iria escrevervar someValue: Int.Type = Int.self
lembre-se que a notação.Type
só é usada ao declarar tipos e assinaturas de tipo para o compilador, e a propriedade.self
é usada em código real para recuperar uma referência ao tipo de objeto em si no tempo de execução.-
A razão pela qual
JSONDecoder().decode
requer um parâmetro deT.Type
(em queT
está em conformidade comDecodable
) é porque qualquer tipo em conformidade comDecodable
tem um inicializadorinit(from decoder: Decoder)
. O métododecode
terá de chamar este método init a um tipo que esteja em conformidade comDecodable
, não numa instância de um tipo que esteja em conformidade comDecodable
. Por exemplo:var someString: String = "" someString.init(describing: 5) // Not possible, doesn't compile. Can't call an initializer on an _instance_ of String var someStringType: String.Type = String.self someStringType.init(describing: 5) // Iniitializes a String instance "5"