2015-12-29 13 views
9

Nếu mảng chính của tôi là ["Hello","Bye","Halo"] và tôi đang tìm kiếm "lo", nó sẽ lọc mảng chỉ đến ["Hello", "Halo"].Lọc chuỗi các chuỗi, bao gồm cả điều kiện "thích"

Đây là những gì tôi đã cố gắng:

let matchingTerms = filter(catalogNames) { 
     $0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch) != nil 
    } 

Nó ném

Type of expression is ambiguous without more context 

Bất kỳ lời đề nghị?

Trả lời

36

Sử dụng contains thay vì:

let arr = ["Hello","Bye","Halo"] 
let filtered = arr.filter { $0.contains("lo") } 
print(filtered) 

Output

[ "Xin chào", "Halo"]

Nhờ @ user3441734 để chỉ ra chức năng đó là tất nhiên chỉ có sẵn khi bạn import Foundation

+0

.. và đừng quên Foundation nhập khẩu – user3441734

+0

Awesome, cảm ơn. Hãy cho tôi vài phút trước khi tôi có thể upVote –

+0

@ user3441734 cảm ơn, bạn là đúng về điều đó - luôn luôn quên nhập khẩu bởi vì họ đã có trong dự án. – luk2302

2

Bạn cũng cần phải so sánh với NSNotFound. Tài liệu cho rangeOfString: options: nói:

Cấu trúc NSRange cho vị trí và độ dài của người nhận xuất hiện đầu tiên của aString, điều chỉnh các tùy chọn trong mặt nạ. Trả về {NSNotFound, 0} nếu không tìm thấy aString hoặc rỗng (@ "").

import Foundation 

let catalogNames = [ "Hats", "Coats", "Trousers" ] 

let matchingTerms = catalogNames.filter { 
    $0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch).location != NSNotFound 
} 
2

với sự giúp đỡ của String mở rộng, bạn có thể sử dụng giải pháp Swift tinh khiết (không Foundation nhập khẩu). Tôi đã không kiểm tra tốc độ, nhưng nó không nên tệ hơn như là nền tảng tương đương.

extension String { 
    func contains(string: String)->Bool { 
     guard !self.isEmpty else { 
      return false 
     } 
     var s = self.characters.map{ $0 } 
     let c = string.characters.map{ $0 } 
     repeat { 
      if s.startsWith(c){ 
       return true 
      } else { 
       s.removeFirst() 
      } 
     } while s.count > c.count - 1 
     return false 
    } 
} 

let arr = ["Hello","Bye","Halo"] 
let filtered = arr.filter { $0.contains("lo") } 

print(filtered) // ["Hello", "Halo"] 

"a".contains("alphabet") // false 
"alphabet".contains("") // true 
24

Trong Swift 3,0

let terms = ["Hello","Bye","Halo"] 

var filterdTerms = [String]() 


func filterContentForSearchText(searchText: String) { 
    filterdTerms = terms.filter { term in 
     return term.lowercased().contains(searchText.lowercased()) 
    } 
} 


filterContentForSearchText(searchText: "Lo") 
print(filterdTerms) 

Output

["Hello", "Halo"] 
+1

Anh ta yêu cầu cú pháp ** ** ** nhanh chóng. Điểm cung cấp câu trả lời nhanh là gì? – GhostCat

+5

Khi một số người tìm kiếm mảng chuỗi lọc chỉ, người đó sẽ nhận được câu trả lời cũng như cập nhật kiến ​​thức cú pháp trong phiên bản nâng cấp –

+6

Tôi nghĩ rằng nó đã được yêu cầu cho Swift 2, cose của nó là thực tế tại thời điểm đó, bây giờ chúng tôi làm việc với Swift 3 để nó có giá trị hơn cho thời điểm này. – Resty

2

của tôi thử ...

let brands = ["Apple", "FB", "Google", "Microsoft", "Amazon"] 

let b = brands.filter{(x) -> Bool in 
(x.lowercased().range(of: "A".lowercased()) != nil) 
} 
print(b) //["Apple", "Amazon"] 
3

Swift 3,1

let catalogNames = [ "Hats", "Coats", "Trousers" ] 
let searchCatalogName = "Hats" 

let filteredCatalogNames = catalogNames.filter { catalogName in 
    return catalogName.localizedCaseInsensitiveContains(searchCatalogName) 
} 

print(filteredCatalogNames) 
Các vấn đề liên quan