신속한 사전 키 배열


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즉 쉽게 매핑 할 수 있습니다 ArrayArrayinit(_:)이니셜.


에서 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

NSDictionaryClass (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.