Swift、My code:でキーワード(文字列)の配列をフィルタリングするのに問題がありました:
self.filteredKeywords=filter(keywords.allValues, {(keyword:NSString) ->
Bool in
let words=keyword as? NSString
return words?.containsString(searchText)
})
AnyObject
をNSString
のサブタイプにすることはできないので、私はこれで立ち往生しています!
Swift 4.2は、これを行うための新しい方法を提供します。
var theBigLebowski = ["The Dude", "Angry Walter", "Maude Lebowski", "Donny Kerabatsos", "The Big Lebowski", "Little Larry Sellers"]
// after removeAll -> ["The Dude", "Angry Walter", "Donny Kerabatsos", "Little Larry Sellers"]
theBigLebowski.removeAll{ $0.contains("Lebowski")}
print(theBigLebowski)
[Swift 2.0]用に更新]
NSString
はフリーダイヤルでSwift String
にブリッジされているので、次のような強制は避けてください。
3> ["abc", "bcd", "xyz"].filter() { nil != $0.rangeOfString("bc") }
$R1: [String] = 2 values {
[0] = "abc"
[1] = "bcd"
}
しかし、allValues
が文字列ではないと思う場合:
(keywords.allValues as? [String]).filter() { nil != $0.rangeOfString("bc") }
オプションの配列を返します。
filter
は[AnyObject]
を超えていますが、クロージャはNSString
かかります。これらは一致する必要があります。また、結果はBool?
ではなくBool
である必要があります。これらは次のように簡単に対処できます。
self.filteredKeywords = filter(keywords.allValues, {
let keyword = $0 as? NSString
return keyword?.containsString(searchText) ?? false
})
これはAnyObject
を受け入れ、それをNSString
まで強制しようとします。次に、結果をnil-coalleces(??
)して、常にBool
であることを確認します。
ただし、keywords
をNSDictionary
ではなく[String:String]
として扱うことをお勧めします。それはAnyObject
のすべての複雑さを取り除くでしょう。次に、これを行うことができます:
self.filteredKeywords = keywords.values.filter { $0.rangeOfString(searchText) != nil }
可能な限り、Foundationコレクションをできるだけ早くSwiftコレクションに変換して保存します。Foundationオブジェクトを受信している場合は、通常、次のような手法で簡単に変換できます。
let dict = nsdict as? [String:String] ?? [:]
または、次の手順を実行して、デバッグでクラッシュするように変換できます(ただし、リリースではサイレントに「動作」します)。
func failWith<T>(msg: String, value: T) -> T {
assertionFailure(msg)
return value
}
let dict = nsdict as? [String:String] ?? failWith("Couldn't convert \(d)", [:])
特定のデータ型に対するGoZonerの回答には問題があり、これを行うには少し良い方法もあります。次の例でこれを示すことができます。
let animalArray: NSMutableArray = ["Dog","Cat","Otter","Deer","Rabbit"]
let filteredAnimals = animalArray.filter { $0.rangeOfString("er") != nil }
print("filteredAnimals:", filteredAnimals)
filteredAnimals: [Dog, Cat, Otter, Deer, Rabbit]
おそらくあなたが期待したセットではありません!
ただし、animalArrayをNSMutableArrayとして入力しない場合、これはこの方法で正常に機能します。
let animalArray = ["Dog","Cat","Otter","Deer","Rabbit"]
let filteredAnimals = animalArray.filter { $0.rangeOfString("er") != nil }
print("filteredAnimals:", filteredAnimals)
filteredAnimals: [Otter, Deer]
ただし、$ 0.rangeOfString()の代わりに$ 0.contains()を使用することをお勧めします!= nil両方の状況で機能し、読みやすさがわずかに向上するためコードの:
let animalArray: NSMutableArray = ["Dog","Cat","Otter","Deer","Rabbit"]
let filteredAnimals = animalArray.filter { $0.contains("er") }
print("filteredAnimals:", filteredAnimals)
filteredAnimals: [Otter, Deer]