2014-06-07 5 views
4

Swift에서 객체가 Dictionary<String, String[]> 인 사전이 있습니다. 사전 구조를 유지하면서 String[] 배열을 필터링 할 수 있기를 바랍니다.Swift에서 사전 내에서 중첩 목록 필터링

내가 "O"를 포함하는 모든 것을 필터링 할 수 및 다음과 같습니다 뭔가 끝내고 싶습니다

let list: Dictionary<String, String[]> = [ 
    "Vegetables" : [ "Carrot", "Potato" ], 
    "Fruit" : [ "Apple", "Orange", "Banana" ] 
] 
:

[ 
    "Vegetables" : [ "Carrot", "Potato" ], 
    "Fruit" : [ "Orange" ] 
] 

가 배열을 필터링하려면, 내가 봤는데 이렇게하면 :

["Carrot", "Potato"].filter { ($0 as NSString).containsString("o") } 

그러나, 지금과 사투를 벌인거야 부분은 사전에 걸쳐 매핑 - 그럼 내가 키를 보존하고 가치에 해당 필터 함수를 호출 할 수 있기 때문이다. 이 일을 어떻게 하죠? 미리 감사드립니다!

답변

5

당신은 for in 루프에서 작업을 수행 할 수 있습니다

for (key, array) in list { 
    list[key] = array.filter { ($0 as NSString).containsString("o") } 
} 

은 또한 사전에 자신의지도 방법을 추가 할 수 있습니다

다음
extension Dictionary { 
    func map(f: (KeyType, ValueType) -> ValueType) -> [KeyType:ValueType] { 
     var ret = [KeyType:ValueType]() 
     for (key, value) in self { 
      ret[key] = f(key, value) 
     } 
     return ret 
    } 
} 

당신은 간단하게 수행 할 수 있습니다

var filteredList = list.map { $1.filter { ($0 as NSString).containsString("o") } } 

참고 : 내 구현 mapDictionarymap과 같은 형식의 사본을 반환합니다. Array

+0

아하 네, 이것이 내가 감사 찾고 있어요 정확히! 그리고 Extension에 대해서도 잊어 버렸습니다. 사전에'map' 메서드가 있기를 기대했기 때문에 이것은 정말 유용합니다. –

+0

안녕하세요, 어떻게 구현했는지 말씀해 주시겠습니까? –

0

1 개 단위로 열거하고 필터링 할 수 있습니다. 방금 const 대신에 변수 목록을 만들었습니다. 여기 코드는 다음과 같습니다

//it's a variable 
var list: Dictionary<String, String[]> = [ 
    "Vegetables" : [ "Carrot", "Potato" ], 
    "Fruit" : [ "Apple", "Orange", "Banana" ] 
] 


for (key, array) in list { 
    list[key] = array.filter({ 
     (x : String) -> Bool in 
     return !(x.rangeOfString("o", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil).isEmpty) 
     }) 
} 
NSLog("%@", list) 

출력은 다음과 같습니다

{ 
    Fruit =  (
     Orange 
    ); 
    Vegetables =  (
     Carrot, 
     Potato 
    ); 
}