web-dev-qa-db-ja.com

Swift文字列のフィルター配列

Swift、My code:でキーワード(文字列)の配列をフィルタリングするのに問題がありました:

self.filteredKeywords=filter(keywords.allValues, {(keyword:NSString) ->                                              
  Bool in
    let words=keyword as? NSString
    return words?.containsString(searchText)
  })

AnyObjectNSStringのサブタイプにすることはできないので、私はこれで立ち往生しています!

9
Meseery

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)
1
Adrian

[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") }

オプションの配列を返します。

16
GoZoner

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であることを確認します。

ただし、keywordsNSDictionaryではなく[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)", [:])
4
Rob Napier

特定のデータ型に対する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]
0
Ryan Davis