2016-06-16 24 views
0

検索テキストフィールドを開発中です。私はこのような文字列の配列を持っています....Swift:配列内の文中の検索文字列

var keywords:[String] = ["dance, music and hippo", "apple juice, tomato"] 

機能を含んでいますが、うまく機能しませんでした。

for i in 0..<keywordsArr.count { 
    if(!keywordsArr[i].contains(searchTextField.text!)){ 
     print("removed \(keywordsArr[i])") 
     keywordsArr.removeAtIndex(i) 
    } 
} 

これは私が使用している拡張機能です。

extension String { 

    func contains(find: String) -> Bool{ 
     return self.rangeOfString(find) != nil 
    } 
} 

結果は、私がテキストで関数を呼び出していなければなりません:あなたは唯一の要素を持つ配列を返すfilterを使用して、非常に簡潔にこれを達成することができ、「音楽」、それはその文字列

+0

あなたは反復処理中に配列を突然変異させています。それは問題を引き起こすかもしれません。通常、この場合、逆の反復を行います(最後から開始します)。 – Larme

+0

私のコードを更新してくれてありがとう:-) –

+0

@PanMluvčíはあなたの編集をロールバックすることができます。答えを含むためにあなたの質問を更新すべきではありません。このようにして、あなたの質問は将来の訪問者に役立つ可能性が高くなります。 – overactor

答えて

1

のインデックスを返す必要がありますクロージャーが保持する。あなたがあなたを繰り返すたびに「keywordsArr.count」とのサイズを再計算しているため、あなたはまた、searchTextField.text

if let text = searchTextField.text { 
    keywordsArr = keywordsArr.filter { $0.contains(text) } 
} 
+0

あなたの方法は私より速くてきれいです:-)投稿していただきありがとうございます。 –

0

まずのアンラップ力を使用しないように、オプションのバインディングを使用する必要がありますが、ループ内の配列サイズを編集しないでください、
これらの数行を使用して、配列に含まれている場合は文字列のインデックスを返し、そうでない場合は-1を返すことができます。
幸運

func doesContain(array:[String], searchString:String) -> Int { 
    let size = array.count 

    for i in 0..<size { 
     if array[i].rangeOfString(searchString) != nil { 
      print("exists") 
      print("removed \(array[i])") 
      return i 
     } 
    } 
    return -1 
} 
var keywords:[String] = ["dance, music and hippo", "apple juice, tomato"] 

doesContain(keywords, searchString: "music") 
関連する問題