Swift で型を変数に代入できるようになっているのは何に使うためですか？


[realm swiftでindexPath.rowを使いたい](https://ja.stackoverflow.com/q/68507/19110)
という質問を見て、Swift では型自体も第一級の値であり、変数に代入できるようになっていることを知りました。しかしアプリ用途かつ静的型付き言語である
Swift で型を値として使えてどのように嬉しいのかが、すぐには分かりませんでした。

Swift で型を値として使うユースケースとして、どのようなものがあるのでしょうか？




例えばJSONDecoderは、JSONデータをマッピングする対象の型を引数としてとります。その型はなんでも良いわけではなく、Decodableプロトコルに準拠している必要があります。  
下記のコードで、JSONデータがGroceryProductのインスタンスにマッピングされます。

[code]

    struct GroceryProduct: Codable {
        var name: String
        var points: Int
        var description: String?
    }
    
    let json = """
    {
        "name": "Durian",
        "points": 600,
        "description": "A fruit with a distinctive scent."
    }
    """.data(using: .utf8)!
    
    let decoder = JSONDecoder()
    let product = try decoder.decode(GroceryProduct.self, from: json)
    
    print(product.name) // Prints "Durian"
    
[/code]

<https://developer.apple.com/documentation/foundation/jsondecoder>

これでJSONがDecodable準拠しているGroceryProductにマッピングされてGroceryProductのインスタンスが返ります。




例えばJSONDecoderは、JSONデータをマッピングする対象の型を引数としてとります。その型はなんでも良いわけではなく、Decodableプロトコルに準拠している必要があります。  
下記のコードで、JSONデータがGroceryProductのインスタンスにマッピングされます。

[code]

    struct GroceryProduct: Codable {
        var name: String
        var points: Int
        var description: String?
    }
    
    let json = """
    {
        "name": "Durian",
        "points": 600,
        "description": "A fruit with a distinctive scent."
    }
    """.data(using: .utf8)!
    
    let decoder = JSONDecoder()
    let product = try decoder.decode(GroceryProduct.self, from: json)
    
    print(product.name) // Prints "Durian"
    
[/code]

<https://developer.apple.com/documentation/foundation/jsondecoder>

これでJSONがDecodable準拠しているGroceryProductにマッピングされてGroceryProductのインスタンスが返ります。

