私のこの質問(および受け入れられた回答)に基づいて、配列内の値の包含をテストしたいと思います。
値はタイプ として定義された変数に格納されAny、配列は として定義され[Any]ます。
変数に格納される値と配列の要素の実際の型は実行時に決定されますが、次の条件を満たすことが保証されています。
- 両方の型 (変数要素と配列要素) が一致し、かつ
String、IntまたはのいずれかBoolです。
これまでのところ、次のコードが機能しています。
var isContained = false
if let intValue = anyValue as? Int {
isContained = arrayOfAny.contains({element in return ((element as? Int) == intValue)})
}
else if let stringValue = anyValue as? String {
isContained = arrayOfAny.contains({element in return ((element as? String) == stringValue)})
}
else if let boolValue = anyValue as? Bool {
isContained = arrayOfAny.contains({element in return ((element as? Bool) == boolValue)})
}
ただし、多くのロジックの重複があり、おそらく次のように、よりスマートにできたらいいのにと思います。
isContained = arrayOfAny.contains({element in
return ((element as? Equatable) == (anyValue as? Equatable))
})
...しかし、プロトコルの使用に関する制限がEquatable邪魔をしています。何かアドバイス?