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

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있습니까?



답변

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

let colors = Array(colorsForColorSchemes.values)

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


답변

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

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)

그리고 그게 다야.


답변

사용하다 colorsForColorScheme.map({$0.value})


답변

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

public extension LazyMapCollection  {

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

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


답변

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

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

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

let colors: [UIColor] = colorsForColorSchemes.values

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

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

let colors = [UIColor](colorsForColorSchemes.values)


답변

이것이 스위프트 5에서 가장 유용한 것으로 나타났습니다.

colorsForColorSchemes.allValues

문서 참조-https: //developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues


답변