開発ブログ - swift で protocol を dict のキーにしたい
swift3
swift で protocol を dict のキーにしたい
swift の Dictionary のキーは Hashable でなければならない
そこで protocol に Hashable をつけてみる
しかしこれでは
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 を使って
とするが
Cannot invoke initialize for type 'ObjectIdentifier' with an argument list of type '(Foo)'
となる
おそらく protocol は struct で実装することができ、
ObjectIdentifier は struct などには使えないからダメなのだろう
そこで Foo を class に限定する
これで完成!
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
これで完成!