higan96技術メモ

https://github.com/higan96

SwiftのGenericsについてのメモ(その1)

概要

SwiftのGenericsを勉強しているのでそのメモ。個人的に難しくて使いこなせていない機能です。 とりあえずThe Swift Programming LanguageのGenericsのページを読んでいる。

Genericsとは

Generic code enables you to write flexible, reusable functions and types that can 
work with any type, subject to requirements that you define.
You can write code that avoids duplication and expresses its intent in a clear, 
abstracted manner.
  • Google翻訳ジェネリックコードを使用すると、定義した要件に応じて、任意の型で機能する柔軟で再利用可能な関数と型を記述できます。重複を避け、その意図を明確で抽象的な方法で表現するコードを書くことができます。」とのこと。
  • そういうやつ、ぐらいの認識です。
  • ArrayやDictionaryもGenericsだよ!気づいてなかったかな??
  • Genericsで出来ることって広範だけど、それぞれできることがラベル付けされてないから理解が進まない印象があったりする
  • よくつかう<T>は「placeholder type name」というらしい
    • 具体的な型が何であるかはここでは問わない
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt is now 107, and anotherInt is now 3
  • Tの型は問わないが、2つの引数の型が同じであることを求めている
  • 引数に渡された値の型によってTの型が自動的に決まる

Type Parameters

Type Parametersとは

  • 先程のGenericsの手法はType Parametersと呼ばれる
    • 指定したplaceholderを引数の型、返り値、関数内で使う変数や定数などの型の指定(type annotation)、で使うことができる
  • カンマで区切れば複数のType Parameterを指定できる
  • extensionで拡張するときに特にType Parameterは指定しなくてもいい。

Type Parametersの名前つけ

  • 使われている場所とtype parameterとの間に関わりがあるならKey、Valueとか(Dictionary)Elementとか(Array)付けよう
  • とくに無ければT, U, Vがよく使われる

Type Constraints(型制約)

  • ParamaterTypeが特定のクラスを継承しているか、特定のprotocolに適合していることを制限することができる
    • DictionaryのkeyはHashableプロトコルに適合している必要がある(そういう制約をつけている)