IT story

신속한 사전 키 배열

hot-time 2020. 4. 15. 12:36
반응형

신속한 사전 키 배열


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

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] (으)로 변환 할 수 없습니다


스위프트 3 & 스위프트 4

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

componentArray = dict.allKeys // for NSDictionary

Swift 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의 사전 키 배열

componentArray = [String] (dict.keys)

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

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


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
    }
}

NSDictionary와는클래스 (참고로 통과) 사전구조 (값 통과 ) ======있는 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)

dict.keys.sorted() 

[String] https://developer.apple.com/documentation/swift/array/2945003-sorted 를 제공합니다.


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

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()

공식 어레이 애플 문서에서 :

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"]"

// 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 }
    }
}

참고 URL : https://stackoverflow.com/questions/26386093/array-from-dictionary-keys-in-swift

반응형