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.

Eu conheço os genéricos, mas o que é 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

Author: Dongkun Lee, 2017-12-15

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 chamando TheType.self. A sintaxe TheType.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 chamando Int.Type. Você ligaria.Int.self

  • No código de exemplo var someValue: Int, a notação específica identifier: 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 escrever var 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 de T.Type (em que T está em conformidade com Decodable) é porque qualquer tipo em conformidade com Decodable tem um inicializador init(from decoder: Decoder). O método decode terá de chamar este método init a um tipo que esteja em conformidade com Decodable, não numa instância de um tipo que esteja em conformidade com Decodable. 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"
    
 9
Author: Daniel Hall, 2017-12-15 18:42:44