আমি কীভাবে সুইফটের একটি অভিধান থেকে একটি নির্দিষ্ট সূচীতে কী পেতে পারি?


114

আমার একটি Dictionaryসুইফটে আছে এবং আমি একটি নির্দিষ্ট সূচীতে একটি কী পেতে চাই।

var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()

আমি জানি যে আমি কীগুলি দিয়ে পুনরাবৃত্তি করতে এবং সেগুলি লগ করতে পারি

for key in myDict.keys{

    NSLog("key = \(key)")

}

যাইহোক, আশ্চর্যের সাথে যথেষ্ট, এই জাতীয় কিছু সম্ভব নয়

var key : String = myDict.keys[0]

কেন?


11
ঠিক তাই আপনি জানেন যে, সুইফ্ট অভিধানগুলি কোনও নির্দিষ্ট ক্রমে থাকার নিশ্চয়তা নেই। সুতরাং কীগুলি আপনি যে ক্রমে
রেখেছেন সেটিকে ঠিক অনুসারে

+1 @রেডেক্স এবং এছাড়াও যুক্ত করতে চাইলে, সম্ভব হলে আপনার বক্তব্য সম্পর্কে আরও পড়ার উত্সটি প্রশংসা হবে।
এসএইচ

উত্তর:


191

কারণ keysরিটার্ন LazyMapCollection<[Key : Value], Key>, যা একটিতে সাবস্ক্রিপশন করা যায় না Int। এটি পরিচালনা করার একটি উপায় হ'ল ডিকশনারিটির startIndexপূর্ণসংখ্যা দ্বারা অগ্রসর করা যা আপনি সাবস্ক্রিপ্ট করতে চেয়েছিলেন, উদাহরণস্বরূপ:

let intIndex = 1 // where intIndex < myDictionary.count
let index = myDictionary.index(myDictionary.startIndex, offsetBy: intIndex)
myDictionary.keys[index]

আর একটি সম্ভাব্য সমাধান হ'ল keysইনপুট হিসাবে কোনও অ্যারে শুরু করা, তারপরে আপনি ফলাফলটিতে পূর্ণসংখ্যা সাবস্ক্রিপ্ট ব্যবহার করতে পারেন:

let firstKey = Array(myDictionary.keys)[0] // or .first

মনে রাখবেন, অভিধানগুলি অন্তর্নিহিতভাবে সীমান্তহীন, তাই কোনও প্রদত্ত সূচিতে কীটি সর্বদা একই থাকে বলে আশা করবেন না।


3
সম্ভবত দ্রুততর হবে Array(myDict)[0].0কারণ এটি কীগুলি অ্যারে অনুলিপি করে না এবং অভিধানের অভ্যন্তরীণ কাঠামো অনুলিপি করে না, যদিও এটি হতে পারে।
ডেভিড বেরি

5
মনে রাখবেন যে এটি কোন কীটি ফিরে আসবে সে সম্পর্কে কোনও প্রতিশ্রুতি নেই, তবে ফিরে আসা "ভিউ" টাইপ সম্পর্কে ভাল নোট। আমার উত্তরটি মুছে ফেলা হয়েছে কারণ এটি আসলে প্রশ্নের প্রয়োগ হয় না apply
রব নেপিয়ার

9
রব কী বলছে তা স্পষ্ট করার জন্য, যদিও মনে হতে পারে কীগুলি সর্বদা সর্বদা একইভাবে অর্ডার করা হয়, এটি ঘটনাটি নয় এবং এটি কেবল একটি বাস্তবায়নের বিশদ। এটি খুব সম্ভব যে আপনি কী "foo" কী যুক্ত করতে পারলেন এবং অভ্যন্তরীণ উপস্থাপনা অভিধানটিকে পুরোপুরি পুনঃক্রম করবে। একটি অভিধানটি মূল-মান জোড়গুলির একটি আনর্ডারড সংগ্রহ। অতএব, উপরের উত্তরটি বিপজ্জনক অনুমানগুলি তৈরি করছে যা সত্য নয়।
জ্যাক লরেন্স 21 ই

8
আপনার যদি একটি নির্দিষ্ট ক্রমে কীগুলি প্রয়োজন হয় তবে সেগুলির একটি অ্যারে রাখুন। তারপর আপনি তাদের মত ব্যবহার করতে পারেন myDict[keysArray[0]]
জেভ আইজেনবার্গ

1
কাজ করে না ...'NSDictionary' is not convertible to '_ArrayBuffer<T>'
ক্রিস

53

সুইফট 3: Array()এটি করতে দরকারী হতে পারে।

কী পান:

let index = 5 // Int Value
Array(myDict)[index].key

মান পান:

Array(myDict)[index].value

এটি আমার জন্য সুইফট ৩-এর জন্য কাজ করে বুঝতে পারে না কেন তৈরি অ্যারেটি পুনরায় সাজানো হয়েছে কেন। কোন চিন্তা?
স্লেয়ার্টি বার্টফেস

ধন্যবাদ এটি আমাকে সহায়তা করেছে
এএনই

1
@ জোসেফ এটি সম্পর্কে কি স্বজ্ঞাত? অভিধানগুলি কী, মান জোড়া, তাই কোনও সূচকের ধারণা ঠিক হয় না। অ্যারেগুলি সূচক দ্বারা অ্যাক্সেস করা হয়, সুতরাং এটি একটি অ্যারেতে একটি অভিধান পরিণত হয় এবং তারপরে সূচি দ্বারা অ্যারেটি অ্যাক্সেস করে। এর মতো ["a": 1, "b": 2]একটি অভিধানকে অভিধানের অ্যারেতে রূপান্তর করা যায় [[key: "a", value: 1], [key: "b", value: 2]], এটি সূচী দ্বারা অ্যাক্সেস করা যায়।
পিটার আর

29

সূচক অনুসারে অভিধানে কী এবং মানগুলিতে অ্যাক্সেসের জন্য এখানে একটি ছোট এক্সটেনশান দেওয়া হল:

extension Dictionary {
    subscript(i: Int) -> (key: Key, value: Value) {
        return self[index(startIndex, offsetBy: i)]
    }
}

3
'অগ্রিম' এপিআইটি স্যুইফ্ট ২.০ ব্যবহারে সরিয়ে ফেলা হয়েছে - স্ব [স্ব.স্টার্টইন্ডেক্স.এডভান্সডবি বাই (আই)] -
রোমেন

2
@ টমসওয়ের অভিধানের অর্ডার দেওয়া হয়নি।
হোসে রামিরেজ

12

আপনি কোনও অভিধানে পুনরাবৃত্তি করতে পারেন এবং ইন-ইন এবং গণনা সহ একটি সূচক ধরতে পারেন (অন্যরা যেমন বলেছেন, এটি নীচের মতো আদেশিত হবে তার কোনও গ্যারান্টি নেই)

let dict = ["c": 123, "d": 045, "a": 456]

for (index, entry) in enumerate(dict) {
    println(index)   // 0       1        2
    println(entry)   // (d, 45) (c, 123) (a, 456)
}

আপনি যদি প্রথমে বাছাই করতে চান ..

var sortedKeysArray = sorted(dict) { $0.0 < $1.0 }
println(sortedKeysArray)   // [(a, 456), (c, 123), (d, 45)]

var sortedValuesArray = sorted(dict) { $0.1 < $1.1 }
println(sortedValuesArray) // [(d, 45), (c, 123), (a, 456)]

তারপরে পুনরাবৃত্তি করুন।

for (index, entry) in enumerate(sortedKeysArray) {
    println(index)    // 0   1   2
    println(entry.0)  // a   c   d
    println(entry.1)  // 456 123 45
}

যদি আপনি কোনও অর্ডারযুক্ত অভিধান তৈরি করতে চান তবে আপনার জেনারিকগুলি সন্ধান করা উচিত।


1
যদি আমি সূচকটি কি 456 এর সমান জন্য অনুসন্ধান করতে চাইতাম?
ফেমিক টেক

2
@ ম্যাক্স, এটি পুরানো সুইফট বাক্য গঠন। এখন আপনি ব্যবহার করতে পারেন: dict.enumerated().forEach { (index, element) in ... }
ম্যাথু করপোরাল

8

Https://developer.apple.com/library/prerelease/ios/docamentation/swift/conceptual/swift_programming_language/ Col લેક્Types.html থেকে :

আপনার যদি কোনও অ্যারের উদাহরণ গ্রহণ করে এমন একটি এপিআই দিয়ে অভিধানের কী বা মানগুলি ব্যবহার করতে হয়, কীগুলি বা মানগুলির সম্পত্তি দিয়ে একটি নতুন অ্যারে শুরু করুন:

let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"]   
let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]


5

ইন সুইফট 3 প্রদত্ত সূচিতে কী-মান জোড়া (tuple) পেতে এই কোড ব্যবহার করতে চেষ্টা করুন:

extension Dictionary {
    subscript(i:Int) -> (key:Key,value:Value) {
        get {
            return self[index(startIndex, offsetBy: i)];
        }
    }
}

3

সুইফট ১.২ ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হল

var person = ["name":"Sean", "gender":"male"]
person.keys.array[1] // "gender", get a dictionary key at specific index 
person.values.array[1] // "male", get a dictionary value at specific index

3

সুইফট 4


সামান্যভাবে অফ-টপিক: তবে আপনার যদি অভিধানের একটি অ্যারে থাকে তবে এটি হ'ল : [[স্ট্রিং: স্ট্রিং]]

var array_has_dictionary = [ // Start of array

   // Dictionary 1

   [ 
     "name" : "xxxx",
     "age" : "xxxx",
     "last_name":"xxx"
   ],

   // Dictionary 2

   [ 
     "name" : "yyy",
     "age" : "yyy",
     "last_name":"yyy"
   ],

 ] // end of array


cell.textLabel?.text =  Array(array_has_dictionary[1])[1].key
// Output: age -> yyy

1
আপনার উদাহরণে বয়স = xxxx থাকা আইটেমটির সূচকটি আমি কীভাবে পেতে পারি?
ফেমিক টেক

1
অ্যারেআইন্ডেক্স = 0, বয়সডিক্ট ইন্ডেক্স = 1, অ্যারে (অ্যারে_হাস_ডিকোয়ান [অ্যারেআইএনডেক্স]। কিজ) [বয়সডিক্ট ইন্ডেক্স] = এক্সএক্সএক্সএক্স
ক্রিশ্চিয়ান

@ ফ্যামিকটেক, ক্রিস আপনার প্রশ্নের উত্তর দিয়েছেন
সুহাইব

0

আমি জাভাতে লিংকডহ্যাশম্যাপের মতো কিছু খুঁজছিলাম। আমি ভুল না হলে সুইফট বা অবজেক্টিভ-সি এর একটিও নেই।

আমার প্রাথমিক চিন্তাটি ছিল আমার অভিধানটি একটি অ্যারেতে মোড়ানো। [[String: UIImage]]তবে আমি বুঝতে পেরেছিলাম যে অভিধান থেকে কীটি Array(dict)[index].keyধরা দুরূহ ছিল তাই আমি টিপলসের সাথে গেলাম। এখন আমার অ্যারে দেখে মনে হচ্ছে [(String, UIImage)]তাই আমি এটিকে পুনরুদ্ধার করতে পারি tuple.0। আর এটিকে আরে রূপান্তর করা হচ্ছে না। শুধু আমার 2 সেন্ট।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.