2014-10-07 4 views
0

다음은 내가하려는 일입니다.신속한 문제 - 사전에 배열을 초기화하고 추가 할 때 발생하는 문제

나는 ArticleItem 개체 배열로 시작하고 있습니다. 이러한 객체에는 문자열 인 'category'라는 속성이 있습니다. 나는 모든 ArticleItem 객체를 반복하고 사전에있는 카테고리와 같은 항목을 그룹화하려고합니다. 카테고리 이름을 키로 사용하고 있습니다. 내가 가지고있는 문제는 내 사전 키가 하나 이상의 객체를 포함하지 않는 홀드 배열이라는 것입니다. 동일한 카테고리 이름을 가진 3 개 이상의 오브젝트가 있습니다. 내 수업의 관련 코드는 다음과 같습니다. 이 작업을 수행하는 올바른 방법을 이해하고 싶습니다.

private var _articlesDict:[String:[ArticleItem]] 

init(articles:[ArticleItem]) { 
    _articlesDict = [String:[ArticleItem]]() 

    for item:ArticleItem in articles { 
     var optionalCatArray:[ArticleItem]? = _articlesDict[item.category] 
     if let catArray = optionalCatArray { 
      optionalCatArray!.append(item) //why can't I do catArray.append(item)? 
     } else { 
      var arr:[ArticleItem] = [ArticleItem]() 
      arr.append(item) 
      _articlesDict[item.category] = arr 
     } 
    } 
} 

답변

1

문제는 배열이 값 형식이므로 참조가 아닌 값으로 전달된다는 것입니다. 즉, 배열에있는 변수를 다른 변수 (또는 배열 또는 사전)에 할당 할 때마다 실제로 그 변수의 복사본을 만듭니다. 그러나 더 많은 것이 있습니다.

1 문제 코드의

이 라인 :이 수정 될 수 있도록

if let catArray = optionalCatArray { 

optionalCatArray의 불변의 복사본을 만듭니다. 대신를 사용

if optionalCatArray != nil { 

2 문제

이 줄의 코드 :

var optionalCatArray:[ArticleItem]? = _articlesDict[item.category] 

가 사전에 저장된 배열의 복사본 생성 - 여기 :

if optionalCatArray != nil { 
    optionalCatArray!.append(item) 

새 항목을 배열에 할당하지만 기억하십시오 :이 사본이므로 복사본이 y입니다. ou는 사전에 포함 된 배열을 수정하지 않습니다. 아마이 코드는 다음과 같이 복사 배열을 피함으로써 개선 될 수

if optionalCatArray != nil { 
    optionalCatArray!.append(item) 
    _articlesDict[item.category] = optionalCatArray! 
} 

: 무엇을 누락하는 것은 사전에 다시 설정입니다

if _articlesDict[item.category] != nil { 
    _articlesDict[item.category]!.append(item) 
} else { 
    _articlesDict[item.category] = [item] 
} 

나는 그것을 테스트하지 않은,하지만 개념적으로 그것을 작동합니다 . 또한 else 브랜치를 어떻게 단축했는지 쉽게 알아볼 수 있습니다. 당신은에서 배열에서 항목을 추출 할 때 ArticleItem으로 캐스팅해야합니다

var _articlesDict = [String:NSMutableArray]() 

init(articles:[ArticleItem]) { 
    for item:ArticleItem in articles { 
     if let array = _articlesDict[item.category] { 
      array.addObject(item) 
     } else { 
      _articlesDict[item.category] = NSMutableArray(object:item) 
     } 
    } 
} 

을하지만 마음에 계속 :

0

다른 답변에서 기본 배열 솔루션에 대한 대안으로, 당신이 할 수있는 사전.

관련 문제