शब्दकोश कुंजी से स्विफ्ट में सरणी


256

स्विफ्ट में शब्दकोश में कुंजियों से तार के साथ एक सरणी भरने की कोशिश कर रहा है।

var componentArray: [String]

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

यह त्रुटि देता है: 'AnyObject' स्ट्रिंग के समान नहीं है

भी आजमाया

componentArray = dict.allKeys as String 

लेकिन मिलता है: 'स्ट्रिंग' [स्ट्रिंग] के लिए परिवर्तनीय नहीं है

जवाबों:


534

स्विफ्ट 3 और स्विफ्ट 4

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

componentArray = dict.allKeys // for NSDictionary

दिलचस्प बात यह है कि एक लूप में - तानाशाही में नाम के लिए। 'नाम' एक स्ट्रिंग बन जाता है और इसे मुद्रित किया जा सकता है और अन्यथा संसाधित किया जा सकता है।
हरे रंग की रात

तानाशाह के पास चाबी का तरीका नहीं है। यह एनएसड्रिल का उदाहरण है, डिक्शनरी का नहीं।
वोमबेल


55

स्विफ्ट 3 के साथ, Dictionaryएक keysसंपत्ति है। keysनिम्नलिखित घोषणा है:

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

एक संग्रह जिसमें केवल शब्दकोश की कुंजी है।

ध्यान दें कि LazyMapCollectionहै कि आसानी से एक करने के लिए मैप किया जा सकता Arrayके साथ Arrayकी init(_:)प्रारंभकर्ता।


से NSDictionaryकरने के लिए[String]

निम्नलिखित iOS AppDelegateवर्ग स्निपेट दिखाता है कि कैसे एक स्ट्रिंग प्राप्त करें ( [String]) keysएक से संपत्ति का उपयोग करके NSDictionary:

यहां छवि विवरण दर्ज करें

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

विस्तार के लिए धन्यवाद। स्विफ्ट में 4.x प्रकार है Dictionary<String, String>.Keys- क्या आपके पास कोई अंतर्दृष्टि है जब हम उस प्रकार का उपयोग करना चाहते हैं और कैसे?
बशीर्ले

46

स्विफ्ट में शब्दकोश कुंजी से सरणी

componentArray = [String] (dict.keys)

मुझे नहीं पता, लोग शॉर्टहैंड सिंटैक्स को क्यों पसंद नहीं करते, जबकि इसे समझना ज्यादा स्पष्ट है।
नताशा

9

dict.allKeysएक स्ट्रिंग नहीं है। यह एक है [String]बिल्कुल के रूप में त्रुटि संदेश आपको बताता है, (बेशक, यह सोचते हैं, कि चाबियाँ हैं सभी स्ट्रिंग्स, यह आप वास्तव में क्या जोर देते हुए कर रहे हैं जब आप कहते हैं कि है)।

तो, या तो टाइपिंग द्वारा शुरू componentArrayके रूप में [AnyObject]है, क्योंकि यह है कि यह कैसे कोको एपीआई में लिखा गया हो, या फिर, अगर आप डाली dict.allKeys, यह करने के लिए डाली [String], क्योंकि यह है कि आप कैसे लिख चुके हैं componentArray


1
यह अब सच नहीं लगता। स्विफ्ट 4.2 में तानाशाह (जो प्रतिस्थापित करता है .allKeys) एक [स्ट्रिंग] नहीं है, यह एक [डिक्शनरी <स्ट्रींग, कोई भी .Keys] है और इसे टाइप करने के लिए एक वेरिएबल टाइप करने से पहले कास्ट किया जाना चाहिए [स्ट्रिंग] @ सेंटो लगता है। कैसे करना है का सबसे सरल काम उदाहरण।
टाइमस्मिथ

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 है क्लास (संदर्भ द्वारा पारित) शब्दकोश है संरचना (मूल्य द्वारा पारित ) ====== NSDictionary से सरणी ======NS सहकर्मी वर्ग प्रकार है शब्दकोश कुंजी और मूल्य की संरचना है

NS सहकर्मी के पास AllKeys और allValues हैं जो किसी भी प्रकार के साथ गुण प्राप्त करते हैं [कोई भी]एनएसबर्ड को एलिक्जेस और अलवल्स के लिए [कोई भी] गुण प्राप्त हुए हैं

  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)

====== शब्दकोश से सरणी ======

शब्दकोश की कुंजी और मूल्यों के लिए 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

आधिकारिक ऐरे Apple प्रलेखन से :

init(_:) - एक अनुक्रम के तत्वों से युक्त एक सरणी बनाता है।

घोषणा

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

पैरामीटर

s - एरे में बदलने के लिए तत्वों का क्रम।

विचार-विमर्श

आप किसी भी अन्य प्रकार से एक सरणी बनाने के लिए इस इनिलाइज़र का उपयोग कर सकते हैं जो अनुक्रम प्रोटोकॉल के अनुरूप है ... आप इस इनिशलाइज़र का उपयोग किसी जटिल अनुक्रम या संग्रह प्रकार को एक सरणी में वापस बदलने के लिए भी कर सकते हैं। उदाहरण के लिए, एक शब्दकोश की कुंजी संपत्ति अपने स्वयं के भंडारण के साथ एक सरणी नहीं है, यह एक संग्रह है जो शब्दकोश से अपने तत्वों को मैप करता है जब वे एक्सेस होते हैं, तो एक सरणी आवंटित करने के लिए आवश्यक समय और स्थान की बचत होती है। यदि आपको उन कुंजियों को पास करने की आवश्यकता है जो एक सरणी लेती है, हालांकि, इस सूची को इसके प्रकार से परिवर्तित करने के लिए इस इनिशलाइज़र का उपयोग करें 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

यह उत्तर तेज शब्दकोश w / स्ट्रिंग कुंजियों के लिए होगा। इस तरह एक नीचे

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

आप इस तरह से Dictionary.map का उपयोग कर सकते हैं:

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

स्पष्टीकरण: मैप माइबर के माध्यम से पुनरावृत्त करता है और प्रत्येक कुंजी और मूल्य जोड़ी को $ 0 के रूप में स्वीकार करता है। यहां से आप $ 0.key या $ 0.value प्राप्त कर सकते हैं। अनुगामी बंद {} के अंदर, आप प्रत्येक तत्व को बदल सकते हैं और उस तत्व को वापस कर सकते हैं। चूंकि आप $ 0 चाहते हैं और आप इसे एक स्ट्रिंग के रूप में चाहते हैं तो आप स्ट्रिंग ($ 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
सुनो! हालांकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण भी शामिल है , जो आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
विंग अप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.