0

私のこの質問(および受け入れられた回答)に基づいて、配列内の値の包含をテストしたいと思います。

値はタイプ として定義された変数に格納されAny、配列は として定義され[Any]ます。

変数に格納される値と配列の要素の実際の型は実行時に決定されますが、次の条件を満たすことが保証されています。

  1. 両方の型 (変数要素と配列要素) が一致し、かつ
  2. StringIntまたはのいずれか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邪魔をしています。何かアドバイス?

4

1 に答える 1

1

私は今、あなたが何をしようとしているのかを見ています。これを機能させる方法の例を次に示します

let arrayOfAny:[AnyObject] = [1,7,9,true, "string"]
func getAny(value:AnyObject) -> [AnyObject]{
    return self.arrayOfAny.filter ({$0 === value})
}

上記の関数は、理想的には単一の結果または空の配列である一致の配列を返します。

例:

self.getAny(1) // [1]
self.getAny(0) // []

単純に Bool を返すように変更することもできます

func getAny(value:AnyObject) -> Bool{
  return self.arrayOfAny.filter ({$0 === value}).count > 0
}

例:

self.getAny(1) // true
self.getAny(0) // false

編集:

Martin R が述べたように、これは常に機能するとは限りません。残念ながら、この回答を投稿する前に完全にはテストしていません。これでしばらく遊んだ後、NicolasMiari と非常によく似たアプローチを思いつきました。

let arrayOfAny:[AnyObject] = [1,Int.max,9,true, "string"]
func getAny(anyValue:AnyObject) -> [AnyObject]{
    return self.arrayOfAny.filter ({
         var exist:Bool
         switch anyValue.self{
            case is String: exist = $0 as? String == anyValue as? String
                break
            case is Int: exist = $0 as? Int == anyValue as? Int
                break
            case is Bool: exist = $0 as? Bool == anyValue as? Bool
                break
            default: exist = false
            }
            return exist
     })

}

このアプローチの欠点は、結果を呼び出すときにandint 1が返されることです。つまり、配列に存在するかのように肯定的な結果が得られます。逆も同様に機能します。trueself.getAny(1)[1,1]1trueIntBool[1]trueInt 1

于 2015-12-08T12:03:16.053 に答える