ジェネリック

トップページ » ジェネリック

20 Jun 2014 03:14公開

※「ジェネリック」はまだ工事中です。まず「Swiftの全貌を探る」シリーズの記事を参考してください。

ジェネリック generic を紹介します。C++、Javaでテンプレートと呼ばれる機能とほぼ同じです。

ジェネリックの宣言

関数などタイプに<…>をつけることで、ジェネリックを宣言します。

func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
 var result = ItemType[]()
 for i in 0..times {
  result += item
 }
 return result
}
repeat("knock", 4)

関数、メソッド、クラス、列挙型、構造体をジェネリックに宣言できます。

// Reimplement the Swift standard library's optional type
enum OptionalValue<T> {
case None
 case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)

whereキーワードで前提条件を指定することができます。例えば

  • タイプはプロトコルを実装します。
  • 二つのタイプが一致します。
  • クラスは指定されたスーパークラスから継承します。
func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
 for lhsItem in lhs {
  for rhsItem in rhs {
   if lhsItem == rhsItem {
    return true
   }
  }
 }
 return false
}
anyCommonElements([1, 2, 3], [3])

シンプルなケースでは、whereを省略できます。下記の二つ記述は同じです。

 <T: Equatable> 
 <T where T: Equatable>.

シリーズ

記事のリスト

  • ジェネリック

レーティング

rating: 0+x

コメント

Add a New Comment
当サイトコンテンツライセンスについて個別な指定がなければCreative Commons Attribution-ShareAlike 3.0 Licenseをベースします。転載や引用は大歓迎です。但し、転載・引用・二次利用の場合は当サイト記事へのURLをリンクし出典を明記してください。各作品を大切にして下さい。 また、記事及びコメントを投稿する皆さまも上記のライセンスを理解した上投稿して下さい。 当サイトのコンテンツは皆さまの投稿で作成されますから、当サイトの意思を反映しておりませんが、第三者の知的財産権などの侵害がある場合、当サイトの運営担当にご連絡ください。