開発ブログ - swift で protocol を dict のキーにしたい

swift で protocol を dict のキーにしたい

カテゴリ : 
技術メモ » swift
執筆 : 
2017/8/25
swift3

swift で protocol を dict のキーにしたい

swift の Dictionary のキーは Hashable でなければならない
そこで protocol に Hashable をつけてみる


protocol Foo: Hashable {
  var a: Int { get }
}

var v: [Foo: Int] = [:]
v[f] = 1


しかしこれでは
Using 'Foo' as a concrete type conforming to protocol 'Hashable' is not supported
Protocol 'Foo' can only be used as a generic constraint because it has Self or associated type requirements

などとエラーになる
そこで ObjectIdentifier を使って

var v: [ObectIdentifier: Int] = [:]
v[ObjectIdentifier(f)] = 1

とするが
Cannot invoke initialize for type 'ObjectIdentifier' with an argument list of type '(Foo)'
となる
おそらく protocol は struct で実装することができ、
ObjectIdentifier は struct などには使えないからダメなのだろう
そこで Foo を class に限定する

protocol Foo: class {
  var a: Int { get }
}

var v: [ObjectIdentifier: Int] = [:]
v[ObjectIdentifier(f)] = 1


これで完成!
  • コメント (0)
  • トラックバック (0)

コメントの投稿

お気軽にコメントください : 投稿されたコメントは承認後に表示されます
プロダクツ

開発ブログ

Link

AD