2016-07-19 2 views
12

에 사전에 [position:name] 고전적인 솔루션입니다 : 지도 배열은 내가 <code>Person</code>의 객체의 배열을 가지고 스위프트

var myDictionary = [Int:String]() 

for person in myArray { 
    myDictionary[person.position] = person.name 
} 

는 우아한 방법 B는있다

extension Dictionary { 
    public init(keyValuePairs: [(Key, Value)]) { 
     self.init() 
     for pair in keyValuePairs { 
      self[pair.0] = pair.1 
     } 
    } 
} 

을 다음에 대한 map를 사용 : 예 스위프트 튜플에서 예를 들어, 당신은 Dictionary 유형에 대한 사용자 정의 이니셜을 쓸 수 있습니다

+0

에서 작동하지 않습니다 – AamirR

답변

28

좋아 map는 U 수, 루프 등 때문에 단지 같은이의 좋은 예 아니다 그 대신에 각각의 개체를 결합하여 하나의 값으로 변환했습니다.

let myDictionary = myArray.reduce([Int: String]()) { (dict, person) -> [Int: String] in 
    var dict = dict 
    dict[person.position] = person.name 
    return dict 
} 

//[2: "b", 3: "c", 1: "a"] 
+0

이 내가 생각했던 방법이다. – Fogmeister

+1

이 방법이 마음에 들지만 단순히 사전을로드하는 루프를 만드는 것보다 효율적입니다. 훨씬 큰 사전의 새로운 변경 가능한 복사본을 만들어야하는 모든 항목에 대한 것처럼 보이기 때문에 성능에 대해 걱정합니다 ... –

+0

실제로 루프입니다.이 방법은이를 작성하는 단순화 된 방법이며, 성능은 동일하거나 다소 개선되었습니다 보통 루프보다 – Tj3n

4

기능적 접근 방식 map, flatMap ... 또는 다른 현대 스위프트 스타일로 그렇게하기 Person의 배열 :

var myDictionary = Dictionary(keyValuePairs: myArray.map{($0.position, $0.name)}) 
1

축소 기능을 사용할 수 있습니다.

let dictionary = myArray.reduce([Int: Person]()){ 
    (total, person) in 
    var totalMutable = total 
    totalMutable.updateValue(person, forKey: total.count) 
    return totalMutable 
} 
: 우선은 Person 클래스

class Person { 
    var name:String 
    var position:Int 

    init(_ n: String,_ p: Int) { 
    name = n 
    position = p 
    } 
} 

이후의 지정된 초기화를 만들었습니다, 나는 값

let myArray = [Person("Bill",1), 
       Person("Steve", 2), 
       Person("Woz", 3)] 

그리고 마지막으로, 사전 변수는 결과가의 배열을 초기화했습니다

15

Swift 4에서 reduceinto 버전을 사용하면 @ Tj3n의 접근 방식을보다 깔끔하게 효율적으로 처리 할 수 ​​있습니다. 임시 딕테이션을 제거합니다. nary 및 반환 값을 반환하므로 읽기가 더 쉽고 빠릅니다.

struct Person { 
    let name: String 
    let position: Int 
} 
let myArray = [Person(name:"h", position: 0), Person(name:"b", position:4), Person(name:"c", position:2)] 
let myDict = myArray.reduce(into: [Int: String]()) { 
    $0[$1.position] = $1.name 
} 
print(myDict) 

참고 : 귀하의 고전적인 방법은 성능이 훨씬 더 스위프트 3.

관련 문제