দ্রুতগতিতে অভিধান কী থেকে অ্যারে


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

মজার বিষয় হল, ডোক.আলকিসে নামের জন্য - লুপের জন্য - 'নাম' একটি স্ট্রিং হয়ে যায় এবং মুদ্রণ করা যায় এবং অন্যথায় প্রক্রিয়াজাত করা যায়।
সবুজ_কনাইট

ডিকের কীগুলির কোনও পদ্ধতি নেই। এটি এনএসডি অভিধানের উদাহরণ, অভিধান নয়।
Womble


55

সুইফট 3 সহ Dictionaryএকটি keysসম্পত্তি রয়েছে। keysনিম্নলিখিত ঘোষণা আছে:

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

অভিধানের কীগুলি সমেত একটি সংগ্রহ।

লক্ষ্য করুন LazyMapCollectionসহজেই একটি ম্যাপ করা যেতে পারে Arrayসঙ্গে Arrayএর init(_:)সূচনাকারী।


থেকে NSDictionaryথেকে[String]

নিম্নলিখিত আইওএস AppDelegateবর্গ শো snippet কিভাবে (স্ট্রিং একটি অ্যারে পেতে [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"]

বিস্তারিত জানার জন্য ধন্যবাদ সুইফট ৪. এক্স-তে টাইপটি হ'ল Dictionary<String, String>.Keys- আমরা যখন এই ধরণের এবং কীভাবে ব্যবহার করতে চাই তখন আপনার কি কোনও অন্তর্দৃষ্টি রয়েছে?
bshirley

46

সুইফটে অভিধান কী থেকে অ্যারে

componentArray = [String] (dict.keys)

আমি জানি না, কেন লোকেরা শর্টহ্যান্ড সিনট্যাক্সকে বেশি পছন্দ করে না কেন এটি বোঝার চেয়ে আরও স্পষ্ট।
নাতাশা

9

dict.allKeysস্ট্রিং নয়। এটা একটা হয় [String], ঠিক যেমন ত্রুটির বার্তা আপনি বলে (অবশ্যই অভিমানী, যে কী হয় সব স্ট্রিং; এই তুমি আসলে কি দাবী করছে যখন আপনি বলে যে)।

সুতরাং, হয় componentArrayহিসাবে টাইপ করে শুরু করুন [AnyObject], কারণ এটি কোকো এপিআইতে এটি টাইপ করা হয়, অথবা অন্যথায় আপনি যদি dict.allKeysকাস্ট করেন তবে এটিকে কাস্ট করুন [String], কারণ এটিই আপনি টাইপ করেছেন componentArray


1
এটি আর সত্য বলে মনে হয় না। সুইফটে ৪.২ ডিক.কিগুলি (যা সবকিস প্রতিস্থাপন করে) কোনও [স্ট্রিং] নয়, এটি একটি [অভিধান <স্ট্রিং, যে কোনও> .কিজ] রয়েছে এবং বিভিন্ন ধরণের [স্ট্রিং] নির্ধারণের আগে অবশ্যই কাস্ট করা উচিত @ সান্টো মনে হয় এটি কীভাবে করা যায় তার সহজতম কাজ উদাহরণ।
সময়স্মিত

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 হয়েছে 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)

====== অভিধান থেকে অ্যারে ======

অভিধানের কী এবং মান বৈশিষ্ট্যগুলির জন্য অ্যাপল রেফারেন্স । এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

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 - অ্যারেতে পরিণত করার উপাদানগুলির ক্রম।

আলোচনা

সিকোয়েন্স প্রোটোকলের সাথে সঙ্গতিপূর্ণ অন্য যে কোনও ধরণের থেকে অ্যারে তৈরি করতে আপনি এই ইনিশিয়ালাইজারটি ব্যবহার করতে পারেন ... একটি জটিল সিকোয়েন্স বা সংগ্রহের ধরণটিকে আবার অ্যারেতে রূপান্তর করতে আপনি এই আরম্ভকারীটিকেও ব্যবহার করতে পারেন। উদাহরণস্বরূপ, অভিধানের কীগুলি নিজস্ব স্টোরেজ সহ কোনও অ্যারে নয়, এটি একটি সংগ্রহ যা অভিধান থেকে তার উপাদানগুলিকে ম্যাপ করে কেবল যখন অ্যাক্সেস করা হয়, একটি অ্যারে বরাদ্দ করার জন্য প্রয়োজনীয় সময় এবং স্থান সাশ্রয় করে। আপনার যদি এই কীগুলি এমন কোনও পদ্ধতিতে পাস করতে হয় যা অ্যারে নেয় তবে এই তালিকাটি এর ধরণের থেকে রূপান্তর করতে এই আরম্ভকারীটি ব্যবহার করুন 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

আপনি ডিকশনারি.ম্যাপ ব্যবহার করতে পারেন:

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

ব্যাখ্যা: মানচিত্রটি মাইডোরিওয়ের মাধ্যমে পুনরাবৃত্তি করে এবং প্রতিটি কী এবং মান জোড়কে $ 0 হিসাবে গ্রহণ করে। এখান থেকে আপনি $ 0. কী বা $ 0. মূল্য পেতে পারেন। ট্রেলিং ক্লোজার ide Ins এর অভ্যন্তরে, আপনি প্রতিটি উপাদানকে রূপান্তর করতে পারেন এবং সেই উপাদানটি ফিরে আসতে পারেন। যেহেতু আপনি $ 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
এই যে! যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
উইং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.