সুইফট অভিধানে কী রয়েছে এবং এর মানগুলির কোনও পাওয়া যায় কিনা তা নির্ধারণ করা হচ্ছে


260

আমি বর্তমানে (অ-খালি) সুইফট অভিধানে প্রদত্ত কীটি রয়েছে কিনা তা নির্ধারণের জন্য এবং একই অভিধান থেকে একটি (কোনও) মান প্রাপ্ত করার জন্য নিম্নলিখিত (আনাড়ি) কোডটি ব্যবহার করছি।

কেউ কীভাবে আরও বেশি মার্জিতভাবে সুইফটে রাখতে পারেন?

// excerpt from method that determines if dict contains key
if let _ = dict[key] {
    return true
}
else {
    return false
}

// excerpt from method that obtains first value from dict
for (_, value) in dict {
    return value
}

আপনি indexForKeyযদি এটি পরিষ্কার এবং আরও স্পষ্ট মনে করেন আপনি ব্যবহার করতে পারেন ; stackoverflow.com/a/29299943/294884
ফ্যাটি

খুব প্রায়শই আপনি যা চান তা মূলত: cityName:String = dict["city"] ?? "" এর ?? ""অর্থ হ'ল মূলত "যদি এরকম কী না থাকে তবে একটি খালি ফিরে দিন"।
ফ্যাটি

উত্তর:


480

এটি করার জন্য আপনার কোনও বিশেষ কোডের দরকার নেই , কারণ এটি একটি অভিধান ইতিমধ্যে করে। আপনি যখন আনতে dict[key]পারবেন তখন অভিধানে কীটি রয়েছে কিনা তা আপনি জানবেন , কারণ আপনি যে ptionচ্ছিক ফিরে আসবেন তা নয় nil(এবং এতে মান রয়েছে)।

সুতরাং, আপনি শুধু প্রশ্ন অভিধান কী আছে কিনা উত্তর দিতে চাই, জিজ্ঞেস করুন:

let keyExists = dict[key] != nil

আপনি যদি মানটি চান এবং অভিধানে কীটি রয়েছে তা আপনি জানেন তবে বলুন:

let val = dict[key]!

তবে, যেমনটি সাধারণত হয়, আপনি কী কী এটি জানেন না - আপনি এটি আনতে এবং এটি ব্যবহার করতে চান তবে কেবল এটি উপস্থিত থাকলে - তবে এর মতো কিছু ব্যবহার করুন if let:

if let val = dict[key] {
    // now val is not nil and the Optional has been unwrapped, so use it
}

6
আমি অনুসরণ করি না আমি সবেমাত্র একটি মান পেয়েছি (দুবার)। আপনি আরো কি করতে চান?
ম্যাট

"প্রথম মান" বলে কোনও জিনিস নেই; একটি অভিধান নিরক্ষিত হয়। আপনি যদি কীগুলি ব্যতীত মানগুলি চান তবে বলুন dict.values
ম্যাট

1
সাবধান থাকবেন কারণ dict.valuesএটি অস্বচ্ছ। আপনি এটি মাধ্যমে চক্র করতে পারেন কিন্তু সব। (ঠিক আছে, আমি সব না, কিন্তু ধাত আমার।) আপনি যদি চান এটা একটি অ্যারের গ্রহণ করতে reified dict.values.array
ম্যাট

1
@ বুবাকাজৌবা এটি চেষ্টা করুন: let d = ["hey":"ho"]; let s = d["hey"]; print(s)এটি সর্বদা যেমন ছিল তেমন একটি ptionচ্ছিক ।
ম্যাট

1
@ ক্রস এটি একটি খুব গভীর প্রশ্ন তবে এটি আলাদাভাবে জিজ্ঞাসা করুন।
ম্যাট

68

খালি কেন চেক করবেন না dict.keys.contains(key)? চেক করার জন্য dict[key] != nilক্ষেত্রেই কাজ করবে না যেখানে মান শূন্য হয়। [String: String?]উদাহরণস্বরূপ একটি অভিধান হিসাবে ।


2
অথবা কেবল লেখার পরিবর্তে আপনি এই ক্ষেত্রে if let val = dict[key]ব্যবহার করতে পারেন if let val = dict[key] as? String
ওখন ওকবায়ে

.keys.contains কী বিদ্যমান কিনা তা মান পার্থক্য করতে সহায়তা করে না, বা মান যদি শূন্য হয়। আগের সুইফ্ট সংস্করণে হতে পারে? দ্রুত 4 এ আমার জন্য কাজ করে না
রোয়ান গন্টিয়ার

8
এটি সম্ভাব্যভাবে অপব্যয়যুক্ত, কারণ (1) আপনি কল করেছেন dict.keysযা সমস্ত কী দিয়ে একটি অ্যারে তৈরি করে, তারপরে (2) আপনি প্রতিটি খুঁজে না পেয়ে (বা কিছুই না!) প্রতিটি কীটি ক্রমে পরীক্ষা করে দেখুন। আমি বুঝতে পেরেছি যে আপনি একটির ক্ষেত্রে সমাধানের চেষ্টা করছেন [String: String?], তবে সেই সমাধানটি সম্পর্কে খুব সতর্ক থাকবেন ...
চার্লস

3
@ চার্লস যেমন উল্লেখ করেছেন, এটি দ্রুত দেখার সুবিধাটি হ্রাস করবে যে অভিধানের সাহায্যে এই সরবরাহের বিপরীতে আমি পরামর্শ দিতে পারি তবে অবশ্যই একটি কার্যকর বিকল্প হতে পারে।
businesscasual

4
আপনার সরাসরি এই অভিধানটি ব্যবহার করা উচিত নয় , এতে সরাসরি অভিধান অ্যাক্সেসের তাত্ত্বিক (হ্যাশ ফাংশন বাস্তবায়নের উপর নির্ভর করে) ও (1) এর পরিবর্তে জটিলতা ও (এন) থাকে।
ক্রিপট

45

let keyExists = dict[key] != nilঅভিধানে কী থাকে তবে গ্রহণযোগ্য উত্তরটি কাজ করবে না তবে শূন্যের মান রয়েছে।

আপনি যদি নিশ্চিত হতে চান যে অভিধানে কীটি মোটেই নেই এটি ব্যবহার করে (সুইফ্ট 4-এ পরীক্ষিত)।

if dict.keys.contains(key) {
  // contains key
} else { 
  // does not contain key
}

3
এটি হানের উত্তর হিসাবে একই।
ডিক্লান ম্যাক

1
== nilঅভিধানে optionচ্ছিক মান থাকলেও পরীক্ষা করা কার্যকর হয়। কারণ ফলাফল ফলাফল হিসাবে একটি মোড়ানো হয় Optional। অন্যদিকে, সন্ধানের মানটি nilঅনুপস্থিতের পরিবর্তে সত্যই কিনা তা পরীক্ষা করতে আপনি ব্যবহার করতে পারেন == .some(nil)
jedwidz

1
অন্যান্য পদ্ধতির ও (1) অনুসন্ধানের তুলনায় আমি এই পদ্ধতিটি ব্যবহারের দক্ষতা যুক্ত করব। আমি বিশ্বাস করি এটি হে (এন) অনুসন্ধান
আলবার্তো ভেগা

1
@ আলবার্তোভেগা-এমএসএফটি এটি O(1)। আরও দেখুন: github.com/apple/swift-evolution/blob/master/proposals/… আপনি কি মনে করেছেন এটি এটি ছিল O(n)?
আলেকজান্ডার - মনিকা পুনরায়

1
এখানেDictionary.Keys.contains(...) ফাংশনের ডকুমেন্টেশন বলছে এটির জটিলতা রয়েছে, যেখানে ক্রমের দৈর্ঘ্য is O(n)n
আদিল হুসেন

5

দেখে মনে হচ্ছে আপনি @ ম্যাট থেকে যা যা প্রয়োজন তা পেয়েছেন তবে আপনি যদি একটি কীটির একটি মান পেতে একটি দ্রুত উপায় চান বা যদি সেই কীটি উপস্থিত না থাকে তবে কেবল প্রথম মানটি:

extension Dictionary {
    func keyedOrFirstValue(key: Key) -> Value? {
        // if key not found, replace the nil with 
        // the first element of the values collection
        return self[key] ?? first(self.values)
        // note, this is still an optional (because the
        // dictionary could be empty)
    }
}

let d = ["one":"red", "two":"blue"]

d.keyedOrFirstValue("one")  // {Some "red"}
d.keyedOrFirstValue("two")  // {Some "blue"}
d.keyedOrFirstValue("three")  // {Some "red”}

দ্রষ্টব্য, আপনি প্রথম মান হিসাবে আসলে কী পাবেন তার কোনও গ্যারান্টি নেই, কেবল "লাল" ফিরে আসার ক্ষেত্রে এটি ঘটে।


1
??অপারেটরের ভাল ব্যবহার আমার কাছ থেকে আমার সুবিধার সমাধান নিয়েছে, তবে একটি এক্সটেনশন হিসাবে যে ডিফল্ট মান ডেটা নিরাপত্তাহীনতা বা অপ্রত্যাশিত আচরণ উপস্থাপন করতে পারে। কিছু ধ্বনি একটি কংক্রিট উপশ্রেণী যে Dictionaryচাকরী কর্তব্য। nilপরিস্থিতি নির্দিষ্ট কার্যকারিতা বাদ দিয়ে কোনও ফেরতের ক্ষেত্রে প্রথমবারের জন্য আপনার কতবার প্রয়োজন হয়?
নুডলঅফডিথ


0

ক্যাশে প্রয়োগের জন্য আমার সমাধান যা alচ্ছিক এনএসএট্রিবিউটেড স্ট্রিং সঞ্চয় করে:

public static var attributedMessageTextCache    = [String: NSAttributedString?]()

    if attributedMessageTextCache.index(forKey: "key") != nil
    {
        if let attributedMessageText = TextChatCache.attributedMessageTextCache["key"]
        {
            return attributedMessageText
        }
        return nil
    }

    TextChatCache.attributedMessageTextCache["key"] = .some(.none)
    return nil

0

সুইফট 3 এ আমার জন্য যা কাজ করে তা এখানে

let _ = (dict[key].map { $0 as? String } ?? "")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.