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

Swift で型を値として使うユースケースとして、どのようなものがあるのでしょうか？
CC BY-SA 4.0
2020-07-25T10:23:32.757
68950
2020-08-05T11:49:28.467
19110
question
swift
Swift で型を変数に代入できるようになっているのは何に使うためですか？
例えばJSONDecoderは、JSONデータをマッピングする対象の型を引数としてとります。その型はなんでも良いわけではなく、Decodableプロトコルに準拠している必要があります。  
下記のコードで、JSONデータがGroceryProductのインスタンスにマッピングされます。

```

    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"
    
```

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

これでJSONがDecodable準拠しているGroceryProductにマッピングされてGroceryProductのインスタンスが返ります。
CC BY-SA 4.0
2020-07-25T10:40:58.073
68952
2020-07-25T10:40:58.073
5519
68950
answer
[@kishikawa katsumi さんの回答](https://ja.stackoverflow.com/a/68952/9008)
と言ってることは同じになってしまいますが、以前
[私が質問（ジェネリクスに型を教えた状態のクラスを返したい）](https://ja.stackoverflow.com/questions/48617/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%82%AF%E3%82%B9%E3%81%AB%E5%9E%8B%E3%82%92%E6%95%99%E3%81%88%E3%81%9F%E7%8A%B6%E6%85%8B%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E8%BF%94%E3%81%97%E3%81%9F%E3%81%84)
して [回答してくださった内容](https://ja.stackoverflow.com/a/48620/9008) も役に立つと思います。

今回の質問において重要なところだけ引用します。

>
> Swiftではジェネリック関数を呼び出す時、ジェネリックパラメータ(この例でいうTTやUUに当てはめるための具体的な型)を明示的に指定することはできません。

>
> 書き方(型推論ができるようにするためだけの型引数を持たせる)と言うのは、Swiftの標準ライブラリでもよく使われているのですが、何か動的に型が指定できるような気がしてくるという欠点があります。(Swiftの型推論はコンパイル時に働く、実行時に動的に働くのではない。)

つまり`型自体`を`第一級の値`として、`ジェネリック関数`の引数に渡すことが標準ライブラリでもよく使われます。これは動的に型を指定できるような気がしてきますが、そうではなくコンパイル時に働いています。用途は型推論ができるようにするためです。
CC BY-SA 4.0
2020-07-26T02:02:59.883
68970
2020-08-05T11:49:28.467
2020-08-05T11:49:28.467
3060
9008
68950
answer