신속한 사전 : 값을 배열로 가져옵니다


151

UIColor열거 형 값으로 해시 된 객체가 포함 된 사전이 있습니다 ColorScheme.

var colorsForColorScheme: [ColorScheme : UIColor] = ...

이 사전에 포함 된 모든 색상 (값)의 배열을 추출하고 싶습니다. values사전 값 ( for value in dictionary.values {...})을 반복 할 때 사용되는 속성을 사용할 수 있다고 생각 했지만 오류가 반환됩니다.

let colors: [UIColor] = colorsForColorSchemes.values
                        ~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'

Array의 값을 반환하는 대신 values메서드가 더 추상적 인 컬렉션 유형을 반환하는 것 같습니다 . 루프 Array에서 사전을 추출하지 않고 사전의 값을 포함 하는 방법이 for-in있습니까?


1
스위프트 5 : colorsForColorSchemes.values
Juan Boero

답변:


285

Swift 2.0부터 Dictionaryvalues속성은 이제 LazyMapCollection대신을 반환 합니다 LazyBidirectionalCollection. Array유형이 추상 수집 유형을 사용하여 자체를 초기화하는 방법을 알고있다 :

let colors = Array(colorsForColorSchemes.values)

Swift의 타입 추론은 이미 이러한 값이 UIColor객체 라는 것을 알고 있으므로 타입 캐스팅이 필요하지 않습니다.


1
유형이 지정된 객체가있는 배열로도 캐스팅 할 수 있습니다. 잘 작동합니다! 덕분에 let colors = [CustomColorObject] (colorsForColorSchemes.values)
bolnad

6
Swift 2.0에서와 같이 Dictionary.values는 이제 LazyBidirectionalCollection과 반대로 LazyMapCollection을 반환합니다. 불행히도 .array는 LazyMapCollection에 정의되어 있지 않습니다. 그러나 배열 유형이 LazyMapCollection에서 자신을 초기화하는 방법을 알고 있으므로 Array (dictionary.values) 방법은 여전히 ​​잘 작동합니다.
Tod Cunningham

8
값의 순서가 예상치 못한 것일 수 있습니다. 예를 들어 [0: "small", 1: "medium", 2: "large"]아마도 생성 되지 않을 것입니다["small", "medium", "large"]
Simon Bengtsson

55

사전을 값의 배열에 맵핑 할 수 있습니다.

let colors = colorsForColorScheme.map { $0.1 }

클로저는 사전에서 키-값 튜플을 가져 와서 값만 반환합니다. 따라서 map 함수는 값의 배열을 생성합니다.

같은 코드의 더 읽기 쉬운 버전 :

let colors = colorsForColorScheme.map { (scheme, color) in
    return color
}

최신 정보

Xcode 9.0부터는 프로토콜 values을 따르는 속성을 사용하여 사전 값에 액세스 할 수 있습니다 Collection.

let colors = colorsForColorScheme.values

일반적으로 배열로 원합니다.

let colors = Array(dict.values)

그리고 그게 다야.


2
그러나 실제로 이것은 배열 let colors = Array (colorsForColorScheme.values)를 얻는 읽기 쉬운 방법입니다.
Renetik

1
이 솔루션을 사랑
Navy Seal

@ pjuzeliunas 여기에 가장 좋은 대답이므로 2020 년 최신으로 편집했습니다. 분명히 긴장을 풀고 편집하는 등! 건배와 감사합니다!
Fattie


8

당신은 확장을 만들 수 있습니다 LazyMapCollection

public extension LazyMapCollection  {

    func toArray() -> [Element]{
        return Array(self)
    }
}

colorsForColorSchemes.values.toArray() 또는 colorsForColorSchemes.keys.toArray()


3

먼저 다음 문장에서 변수 (사전) 이름은 다음과 같습니다. colorsForColorScheme

var colorsForColorScheme: [ColorScheme : UIColor] = ... 

당신이 colorsForColorSchemes할 때 사전 에서 값을 얻으려고하는 동안

let colors: [UIColor] = colorsForColorSchemes.values

컴파일 시간 오류가 발생합니다. 어쨌든 나는 당신이 오타가 있다고 가정하고 있으며, 사전의 이름은 colorsForColorSchemes입니다. 그래서 여기 해결책이 있습니다.

앞에서 언급했듯이 신속하게 형식 유추 속성으로 인해 코드에서 .values함수 에서 반환 된 형식 이 UIColor 배열을 반환하고 있다고 유추 할 수 있습니다 . 그러나 Swift는 유형 안전을 원하므로 colors배열에 값을 저장할 때 명시 적으로 정의해야합니다. 신속한 5 이상에서는 이제 다음을 수행 할 수 있습니다.

let colors = [UIColor](colorsForColorSchemes.values)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.