2016-10-20 11 views
0

나는 사전에 목록을 저장하고 있습니다. 이 목록은 업데이트해야합니다. 그러나 항목을 검색 할 때 [] 연산자가 필요합니다. 결과를 변수에 저장하면 사본이 사용됩니다. 목록 자체를 변경하려면 다음을 사용하십시오.스위프트 3 : 사전에서 항목 변경

 item = dicMyList[key] 
     if item != nil { 
      // add it to existing list 
      dicMyList[key]!.list.append(filename) 
//   item?.list.append(filename) 
     } 

위의 주석 처리되지 않은 코드가 필요하지만 사전에 액세스하여 다시 검색합니다. 다시 검색하지 않고 어떻게 결과를 저장할 수 있습니까? (주석 달린 줄처럼) 코드 속도를 높이고 싶습니다.

+0

[this] (http://stackoverflow.com/questions/29189955/how-to-mutate-an-array-in-a-dictionary-wift-objects) 귀하의 사례는 무엇입니까? –

+0

"* *이 액세스 및 사전 *에서 다시 검색"이란 무엇을 의미합니까? 사전의 특성상 키의 값을 찾기 위해 검색 할 필요가 없다는 것을 의미합니다. 조회는 O (1) 시간에 수행됩니다. – Hamish

+0

네, 그렇습니다. :-) "이것은 사전에 다시 액세스하고 검색합니다"는 의미로 dicMyList [key] 객체가 이미 사용 가능하다는 것을 의미합니다. 그리고 그것이 O (1)이더라도, 필요하지 않은 추가적인 계산이 필요합니다. 예전처럼, C에서 struct에 대한 포인터를 얻었을 때와 마찬가지로 직접 사용할 수 있습니다. * p = newValue – Peter71

답변

1

사전 및 배열은 값 유형입니다. 따라서 항목을 변경하면 사전에 다시 저장해야합니다. 당신이 내부 list이 실제로 존재 여부를 사전 요소 fileName를 추가로되었는지 여부를 확인할 필요가없는 경우

if var list = dicMyList[key] { 
    list.append(filename) 
    dicMyList[key] = list 
} else { 
    dicMyList[key] = [filename] 
} 
+0

대신에 dicMyList [key] = list' 대신에'dicMyList.updateValue (list, forKey : key)'를 사용할 수 있습니다. 그러나 어느 쪽이든 괜찮습니다. @ appzYourLife가 선명함을 선호합니다. –

2

, 당신은 nil 병합 연산자의 더 컴팩트 한 솔루션 만들기 사용을 사용할 수 있습니다.

// example setup 
var dicMyList = [1: ["foo.sig", "bar.cc"]] // [Int: [String]] dict 
var key = 1 
var fileName = "baz.h" 

// "append" (copy-in/copy-out) 'fileName' to inner array associated 
// with 'key'; constructing a new key-value pair in case none exist 
dicMyList[key] = (dicMyList[key] ?? []) + [fileName] 
print(dicMyList) // [1: ["foo.sig", "bar.cc", "baz.h"]] 

// same method used for non-existant key 
key = 2 
fileName = "bax.swift" 
dicMyList[key] = (dicMyList[key] ?? []) + [fileName] 
print(dicMyList) // [2: ["bax.swift"], 1: ["foo.sig", "bar.cc", "baz.h"]] 
+0

"dicMyList [ key] = (dicMyList [key] ?? []) + [fileName] "또한 dicMyList [key]를 두 번 계산해야합니다. 그것은 피하는 것이 좋습니다. 결과를 저장하고 다시 사용하는 것이 좋습니다. 그러나 Swift 3.0에서는 다른 게시물에 대한 모든 답변을 올바르게 읽으면 현재로서는 불가능한 것으로 보입니다. – Peter71

+1

@ Peter71 이것이 성과상의 문제가 될 것이라는 것을 알고 계십니까? _ 일반적으로 _ 성능 최적화에 많은 작업을 넣을 수 있습니다. 결국 "최적화되지 않은"상태로 남아 있으면 프로파일 러에서 문제로 표시되지 않습니다. – dfri

+0

감사합니다. 아니요, 병목 현상이라고 생각하지 않습니다. 그냥 좋은 코드를 작성하는 것입니다. :-) – Peter71