2017-12-30 54 views
2

Swift에서 모음집에서 사전을 작성하려면 Swift reduce을 사용하려고합니다. 나는 다음과 같은 변수가 있습니다Swift에서 reduce를 사용하여 사전 작성

var _squares : [String] = [] 
var _unitlist : [[String]] = [] 
var _units = [String: [[String]]]() 

나는 다음과 같은 방법 INT _units 사전 채우려 :

  • 내가 전혀보고 싶지 _squares
  • 의 모든 요소를 ​​반복 할을 _unitlist의 목록 및 요소가 포함 된 요소 만 필터링하십시오.
  • 모든 단일 요소를 키로 포함하는 사전 및 해당 elem을 포함하는 목록을 작성하십시오 가치로서.

예를 들어 설명해주십시오. 우리가있는 경우 :

squares = ["A"] 
unitlist = [["A", "B", "C"], ["A", "C"], ["B", "C", "F"]] 

예상 출력 키로 사전 디 "A"하고 값으로 [["A", "B", "C"], ["A", "C"]]한다. 그때 여과하고 내가 reduce을 사용하려고, 나는 반복 두 번 flatMap을 사용

_units = _squares.flatMap { s in 
    _unitlist.flatMap { $0 }.filter {$0.contains(s)} 
     .reduce([String: [[String]]]()){ (dict, list) in 
      dict.updateValue(l, forKey: s) 
      return dict 
    } 
} 

:

는이 같은 뭔가를 시도했다.

그러나이 코드를 사용하면 다음과 같은 오류가 발생합니다. Cannot assign value of type '[(key: String, value: [[String]])]' to type '[String : [[String]]]' 그것은 나에게 조금 어둡습니다.

답변

3
let squares = ["A"] 
let unitlist = [["A", "B", "C"], ["A", "C"], ["B", "C", "F"]] 

let units = squares.reduce(into: [String: [[String]]]()) { result, key in 
    result[key] = unitlist.filter { $0.contains(key) } 
} 
+0

니스와 우아한 해결책 : 여기에 놀이터입니다! 좀 더 자세히 설명해 주시겠습니까? –

+1

@GiovanniGrano 물론, 내 답변에 무엇을 정교하게 쓰겠습니까? –

+1

스위프트는 타입 유추 된 언어'reduce (into : [:]) '입니다. –

1

filter을 사용하여 키를 반복하고 값을 구성 할 수 있습니다.

import PlaygroundSupport 
import UIKit 


let squares = ["A"] 
let unitlist = [["A", "B", "C"], ["A", "C"], ["B", "C", "F"]] 

func dictionary(keys: [String], containing values: [[String]]) -> [String: [[String]]]{ 
    var dictionary: [String: [[String]]] = [:] 
    keys.forEach { key in 
    dictionary[key] = values.filter { $0.contains(key) } 
    } 
    return dictionary 
} 

print(dictionary(keys: squares, containing: unitlist))