신속한 사전 키 배열


256

신속하게 사전의 키에서 문자열로 배열을 채우려 고합니다.

var componentArray: [String]

let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Components", ofType: "plist")!)
componentArray = dict.allKeys

'AnyObject'가 string과 동일하지 않은 오류를 리턴합니다.

또한 시도

componentArray = dict.allKeys as String 

get : 'String'은 [String] (으)로 변환 할 수 없습니다

답변:


534

스위프트 3 & 스위프트 4

componentArray = Array(dict.keys) // for Dictionary

componentArray = dict.allKeys // for NSDictionary

흥미롭게도 dict.allKeys의 이름에 대해 for 루프에서 'name'은 문자열이되고 인쇄 및 처리 될 수 있습니다.
— green_knight

dict에는 키 방법이 없습니다. 사전이 아닌 NSDictionary의 인스턴스입니다.
— 분

2
dict.map {$ 0.key}
— Nilanshu Jaiswal

55

스위프트 3 Dictionary에는 keys속성이 있습니다. keys다음과 같은 선언이 있습니다.

var keys: LazyMapCollection<Dictionary<Key, Value>, Key> { get }

사전의 키만 포함하는 컬렉션입니다.

참고 LazyMapCollection즉 쉽게 매핑 할 수 있습니다 Array와 Array의 init(_:)이니셜.


에서 NSDictionary로[String]

다음 iOS AppDelegate클래스 스 니펫은의 속성을 [String]사용하여 문자열 배열 ( ) 을 얻는 방법을 보여줍니다 .keysNSDictionary

여기에 이미지 설명을 입력하십시오

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let string = Bundle.main.path(forResource: "Components", ofType: "plist")!
    if let dict = NSDictionary(contentsOfFile: string) as? [String : Int] {
        let lazyMapCollection = dict.keys
        
        let componentArray = Array(lazyMapCollection)
        print(componentArray)
        // prints: ["Car", "Boat"]
    }
    
    return true
}

에서 [String: Int]로[String]

보다 일반적인 방법으로 다음 놀이터 코드는 문자열 키와 정수 값 ( )이 있는 사전에서 속성을 [String]사용하여 문자열 배열 ( ) 을 얻는 방법을 보여줍니다 .keys[String: Int]

let dictionary = ["Gabrielle": 49, "Bree": 32, "Susan": 12, "Lynette": 7]
let lazyMapCollection = dictionary.keys

let stringArray = Array(lazyMapCollection)
print(stringArray)
// prints: ["Bree", "Susan", "Lynette", "Gabrielle"]

에서 [Int: String]로[String]

다음 놀이터 코드는 정수 키와 문자열 값 ( )이 있는 사전에서 속성을 [String]사용하여 문자열 배열 ( ) 을 얻는 방법을 보여줍니다 .keys[Int: String]

let dictionary = [49: "Gabrielle", 32: "Bree", 12: "Susan", 7: "Lynette"]
let lazyMapCollection = dictionary.keys
    
let stringArray = Array(lazyMapCollection.map { String($0) })
// let stringArray = Array(lazyMapCollection).map { String($0) } // also works
print(stringArray)
// prints: ["32", "12", "7", "49"]

세부 사항에 감사드립니다. Swift 4.x에서 유형은 Dictionary<String, String>.Keys다음과 같습니다. 해당 유형을 사용하고 싶을 때 통찰력이 있습니까?
— bshirley

46

Swift의 사전 키 배열

componentArray = [String] (dict.keys)

왜 사람들이 속기 구문을 선호하지 않는지 이해하는 것이 훨씬 더 명확하지 않습니다.
— Natasha

9

dict.allKeys문자열이 아닙니다. 그것은 [String]오류 메시지가 알려주는 것과 정확히 같습니다 (물론 키 가 모두 문자열 이라고 가정하면 정확히 말할 때 주장하는 것입니다).

따라서 componentArrayas 로 입력하는 것으로 시작 [AnyObject]하십시오. 이것이 Cocoa API에서 입력되는 방식이기 때문입니다. 또는 dict.allKeys캐스트하는 [String]경우을 입력하십시오 componentArray.


1
이것은 더 이상 사실이 아닌 것 같습니다. Swift 4.2에서 .allKeys를 대체하는 dict.keys는 [String]이 아니며 [Dictionary <String, Any> .Keys]이며 [String] 유형의 변수에 할당하기 전에 캐스팅해야합니다. 그렇게하는 가장 간단한 작업 예입니다.
— timeSmith

5
extension Array {
    public func toDictionary<Key: Hashable>(with selectKey: (Element) -> Key) -> [Key:Element] {
        var dict = [Key:Element]()
        for element in self {
            dict[selectKey(element)] = element
        }
        return dict
    }
}

3

NSDictionary 는 Class (pass by reference) Dictionary is Structure (pass by value )입니다. NSDictionary는 클래스 유형입니다 사전은 키와 가치의 구조입니다 ====== NSDictionary의 배열 ======

NSDictionary에는 allKeys가 있으며 allValues 는 [Any] 유형의 특성을 가져옵니다 .NSDictionary는 allkeys 및 allvalues에 대한 [Any] 속성을 갖습니다.

  let objesctNSDictionary = 
    NSDictionary.init(dictionary: ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"])
            let objectArrayOfAllKeys:Array = objesctNSDictionary.allKeys
            let objectArrayOfAllValues:Array = objesctNSDictionary.allValues
            print(objectArrayOfAllKeys)
            print(objectArrayOfAllValues)

====== 사전에서 배열 ======

Dictionary의 키 및 값 속성에 대한 Apple 참조 . 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

let objectDictionary:Dictionary = 
            ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"]
    let objectArrayOfAllKeys:Array = Array(objectDictionary.keys)          
    let objectArrayOfAllValues:Array = Array(objectDictionary.values)
    print(objectArrayOfAllKeys)
    print(objectArrayOfAllValues)


3

공식 배열 애플 문서에서 :

init(_:) -시퀀스의 요소를 포함하는 배열을 만듭니다.

선언

Array.init<S>(_ s: S) where Element == S.Element, S : Sequence

매개 변수

s- 배열로 변환 할 요소의 순서

토론

이 이니셜 라이저를 사용하여 시퀀스 프로토콜을 따르는 다른 유형의 배열을 작성할 수 있습니다.이 이니셜 라이저를 사용하여 복잡한 시퀀스 또는 콜렉션 유형을 다시 배열로 변환 할 수도 있습니다. 예를 들어, 사전의 keys 속성은 자체 저장소가있는 배열이 아니며, 액세스 할 때만 사전에서 요소를 매핑하여 배열을 할당하는 데 필요한 시간과 공간을 절약하는 컬렉션입니다. 그러나 배열을 사용하는 메소드에 해당 키를 전달해야하는 경우이 이니셜 라이저를 사용하여 유형 목록에서 해당 목록을 변환하십시오 LazyMapCollection<Dictionary<String, Int>, Int> to a simple [String].

func cacheImagesWithNames(names: [String]) {
    // custom image loading and caching
 }

let namedHues: [String: Int] = ["Vermillion": 18, "Magenta": 302,
        "Gold": 50, "Cerise": 320]
let colorNames = Array(namedHues.keys)
cacheImagesWithNames(colorNames)

print(colorNames)
// Prints "["Gold", "Cerise", "Magenta", "Vermillion"]"

1

이 대답은 문자열 키가있는 빠른 사전에 대한 것입니다. 아래에서 이와 같이 .

let dict: [String: Int] = ["hey": 1, "yo": 2, "sup": 3, "hello": 4, "whassup": 5]

여기에 사용할 확장이 있습니다.

extension Dictionary {
  func allKeys() -> [String] {
    guard self.keys.first is String else {
      debugPrint("This function will not return other hashable types. (Only strings)")
      return []
    }
    return self.flatMap { (anEntry) -> String? in
                          guard let temp = anEntry.key as? String else { return nil }
                          return temp }
  }
}

그리고 나중에 이것을 사용하여 모든 키를 얻습니다.

let componentsArray = dict.allKeys()

1

스위프트 5

var dict = ["key1":"Value1", "key2":"Value2"]

let k = dict.keys

var a: [String]()
a.append(contentsOf: k)

이것은 나를 위해 작동합니다.


1

다음과 같이 dictionary.map을 사용할 수 있습니다.

let myKeys: [String] = myDictionary.map{String($0.key) }

설명 : Map은 myDictionary를 반복하고 각 키와 값 쌍을 $ 0으로 허용합니다. 여기에서 $ 0.key 또는 $ 0.value를 얻을 수 있습니다. 후행 클로저 {} 안에서 각 요소를 변환하고 해당 요소를 반환 할 수 있습니다. $ 0을 원하고 문자열로 원하면 String ($ 0.key)를 사용하여 변환하십시오. 변환 된 요소를 문자열 배열로 수집합니다.


-2
// Old version (for history)
let keys = dictionary.keys.map { $0 }
let keys = dictionary?.keys.map { $0 } ?? [T]()

// New more explained version for our ducks
extension Dictionary {

    var allKeys: [Dictionary.Key] {
        return self.keys.map { $0 }
    }
}

2
이봐! 이 코드 스 니펫이 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
— Wing
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.