このエラー メッセージの理由は、Array
宣言が機能する場合に発生する次の問題です。
protocol SomeProtocol {
typealias T
func doSomething(something: T)
}
// has already some values
let a: Array<SomeProtocol> = [...]
// what type should be passed as parameter?
// the type of T in SomeProtocol is not defined
a[0].doSomething(...)
回避策として、任意のタイプのジェネリック ラッパー構造体を作成して、SomeProtocol
タイプを指定できるようにすることができますT
(Swift 標準ライブラリの AnyGenerator、AnySequence などのように)。
struct AnySomeProtocol<T>: SomeProtocol {
let _doSomething: T -> ()
// can only be initialized with a value of type SomeProtocol
init<Base: SomeProtocol where Base.T == T>(_ base: Base) {
_doSomething = base.doSomething
}
func doSomething(something: T) {
_doSomething(something)
}
}
タイプの配列を使用し[AnySomeProtocol<T>]
(必要なタイプに置き換えT
ます)、要素を追加する前に次のように変換しAnySomeProtocol
ます。
var array = [AnySomeProtocol<String>]()
array.append(AnySomeProtocol(someType))
// doSomething can only be called with a string
array[0].doSomething("a string")