কীভাবে উপাদানগুলিকে সুইফটে একটি অভিধানে যুক্ত করতে হয়?


217

আমার একটি সাধারণ অভিধান রয়েছে যা সংজ্ঞায়িত হয়:

var dict : NSDictionary = [ 1 : "abc", 2 : "cde"]

এখন আমি এই অভিধানে একটি উপাদান যুক্ত করতে চাই: 3 : "efg"

3 : "efg"এই বিদ্যমান অভিধানে আমি কীভাবে যুক্ত করতে পারি ?


এনএসআউটটেবল অভিধান ব্যবহার করুন
সৌরভ প্রজাপতি

1
আপনার কীগুলি 1, 2 এবং 3 নম্বর বলে মনে হচ্ছে, আপনি কি নিশ্চিত যে আপনি একটি অভিধান চান এবং অ্যারে না?
gnasher729

উত্তর:


240

আপনি ব্যবহার করছেন NSDictionary। আপনার কোনও কারণে স্পষ্টভাবে এ জাতীয় ধরণের হওয়া প্রয়োজন না হলে আমি একটি সুইফ্ট অভিধান ব্যবহার করার পরামর্শ দিই।

NSDictionaryকোনও অতিরিক্ত কাজ ছাড়াই প্রত্যাশিত যে কোনও ফাংশনে আপনি একটি সুইফট ডিকশনারি পাস করতে পারেন , কারণ Dictionary<>এবং NSDictionaryনির্বিঘ্নে একে অপরের সাথে ব্রিজ হয়ে যায়। নেটিভ সুইফ্ট পদ্ধতির সুবিধাটি হ'ল অভিধানটি জেনেরিক প্রকারগুলি ব্যবহার করে, সুতরাং আপনি যদি Intএটি কী এবং Stringমান হিসাবে সংজ্ঞায়িত করেন তবে আপনি ভুলভাবে কী এবং বিভিন্ন ধরণের মানগুলি ব্যবহার করতে পারবেন না। (সংকলকটি আপনার পক্ষে প্রকারগুলি পরীক্ষা করে))

আমি আপনার কোডে যা দেখছি তার ভিত্তিতে, আপনার Intঅভিধানটি কী Stringহিসাবে এবং মান হিসাবে ব্যবহার করে। একটি উদাহরণ তৈরি করতে এবং পরবর্তী সময়ে কোনও আইটেম যুক্ত করতে আপনি এই কোডটি ব্যবহার করতে পারেন:

var dict = [1: "abc", 2: "cde"] // dict is of type Dictionary<Int, String>
dict[3] = "efg"

আপনার যদি পরে এটিকে NSDictionaryধরণের বৈকল্পের জন্য নির্ধারিত করতে হয় তবে কেবল একটি স্পষ্ট কাস্ট করুন:

let nsDict = dict as! NSDictionary

এবং যেমনটি পূর্বে উল্লিখিত হয়েছে, আপনি যদি এটি প্রত্যাশিত কোনও ফাংশনে পাস করতে চান তবে NSDictionaryকোনও castালাই বা রূপান্তর ছাড়াই এটি পাস করুন।


একজন ব্যক্তির আসলে কী করা উচিত তার সঠিক ব্যাখ্যার জন্য ধন্যবাদ। কোনও Dictionaryঅবজেক্ট তৈরি এবং তা পরিচালনা করতে সুইফটের সুবিধার্থে কাজে লাগানো এবং NSDictionaryআপনার যদি প্রয়োজন হয় তবে শেষে এটি রূপান্তর । ওয়ান্ডারফুল। ধন্যবাদ।
জোশুয়া পিন্টার

যাইহোক এমন কি আছে যে আমি একটি ডিলিমিটার ( অ্যাডভ্যালুর অনুরূপ ) ব্যবহার করে একই কীতে যুক্ত করতে পারি । আমি চাবিতে একটি যুক্ত করা চাই যাতে ফিরে আসবে । "Antonio"1dic[1]"abc, Antonio"
মধু

@ মধু যে আমি অবগত নই ... তবে উপাদানটি ইতিমধ্যে উপস্থিত থাকলে এটি একটি সহজ সংযোজন
আন্তোনিও

113

আপনি নিম্নলিখিত উপায় ব্যবহার করে যুক্ত করতে পারেন এবং এতে পরিবর্তন Dictionaryকরতে পারেনNSMutableDictionary

dict["key"] = "value"

2
আমি একটি ত্রুটি পেয়েছি যা বলেছেCannot assign to the result of this expression
ধর্মেশ খেেনি

আপনার প্রশ্নের জন্য এই উপায় যুক্ত করুন [3] = "ইফজি";
yashwanth77

আমার সম্পাদিত উত্তরটি এটির কাজ করে এমন মিউটটেবলের কাছে me.change ডিকশনারিটির জন্য কাজ করে দেখুন!
yashwanth77

1
dict["testval"] = "test".. ত্রুটিfatal error: unexpectedly found nil while unwrapping an Optional value
jose920405

2
এটি ২.২+ এর সাথে কাজ করবে না, ডিকটি কেবলমাত্র সেই অভিব্যক্তিতেই
পড়বে

67

আমি জানি এটি খুব দেরিতে আসতে পারে তবে এটি কারও পক্ষে কার্যকর প্রমাণিত হতে পারে। তাই দ্রুতগতিতে অভিধানে মূল মান জোড় যুক্ত করার জন্য আপনি আপডেটভ্যালু (মান:, ফোরকি:) পদ্ধতিটি নিম্নরূপ ব্যবহার করতে পারেন :

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)

49

সুইফট 3 - এক্সকোড 8.1

var dictionary =  [Int:String]() 

dictionary.updateValue(value: "Hola", forKey: 1)
dictionary.updateValue(value: "Hello", forKey: 2)
dictionary.updateValue(value: "Aloha", forKey: 3)

সুতরাং, আপনার অভিধানে রয়েছে:

অভিধান [1: হোলা, 2: হ্যালো, 3: আলোহা]


3
এর চেয়ে ভাল কীভাবে dictionary[1] = "Hola"?
বেন লেগিজিও

এটি করার সহজ উপায়। আপনার যা করা দরকার তা সমস্ত নির্ভর করে! আমি আমার কেস, এটি সেরা উপায়
ক্রিশ্চিয়ান মোরা

4
আমি বুঝতে পারি যে আপনি এটি ভাল বলে মনে করেন; এজন্য আপনি এটি পোস্ট করেছেন। তবে আমি দেখতে পাচ্ছি না কিভাবে এটি আরও ভাল। দয়া করে আমাকে বলুন এটি কীভাবে ভাল
বেন লেগজিও

আমি সম্মত হই যে "addValue" বা "setValue" নামক একটি পদ্ধতি থাকা উচিত, যে নামটি যেমন বলেছে আপডেট করার জন্য "আপডেটভ্যালু" ব্যবহার করা উচিত
pkarc

কারণটি হ'ল ডিকশনারিটি যখন করা হয়েছিল তখন তার একটি মান থাকে [যা শূন্যের চেয়ে পৃথক, সুতরাং প্রয়োজনীয় সম্পত্তি আপডেটভ্যালু ব্যবহার করা প্রয়োজন কারণ আমরা মানটি পরিবর্তন করার চেষ্টা করছি এবং এটি সন্নিবেশ করছিলাম না।
ক্রিশ্চিয়ান মোরা

16

আপনার অভিধানটি যদি Intহয় তবে Stringআপনি তা সহজভাবে করতে পারেন:

dict[3] = "efg"

আপনি উপাদান যোগ করার মানে যদি মান অভিধান একটি সম্ভাব্য সমাধান:

var dict = Dictionary<String, Array<Int>>()

dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)

16

সুইফট 3+

অভিধানে নতুন মান নির্ধারণের উদাহরণ। আপনার এটিকে এনএস পরিবর্তনযোগ্য অভিধান হিসাবে ঘোষণা করতে হবে:

var myDictionary: NSMutableDictionary = [:]
let newValue = 1
myDictionary["newKey"] = newValue
print(myDictionary)

12

সুইফটে , আপনি যদি এনএসডি অভিধান ব্যবহার করছেন তবে আপনি ব্যবহার করতে পারেন setValue:

dict.setValue("value", forKey: "key")

1
ভবিষ্যতে আপনার উত্তরটি সম্পাদনা করুন, ডাউনভোটগুলি এড়াতে আরও তথ্য যুক্ত করার বিষয়ে বিবেচনা করুন।
হুয়ান বোয়েরো

11

নীচে হিসাবে দুটি অভিধান দেওয়া:

var dic1 = ["a": 1, "c": 2]
var dic2 = ["e": 3, "f": 4]

এখানে কিভাবে আপনার কাছ থেকে সব আইটেম যোগ করতে পারেন dic2 করার dic1 :

dic2.map {
   dic1[$0.0] = $0.1
}

চিয়ার্স এ।


9
আমাদের কোনও রিটার্ন .forEach.map
ম্যাপযুক্ত

9

Dict.updateValue অভিধান থেকে বিদ্যমান কীটির জন্য আপডেট হওয়া মান বা কী উপস্থিত না থাকলে নতুন নতুন কী-মান জুটি যুক্ত করে।

নিদর্শন

var caseStatusParams: [String: AnyObject] = ["userId" : UserDefault.userID ]
caseStatusParams.updateValue("Hello" as AnyObject, forKey: "otherNotes")

ফলাফল-

: 2 elements
    - key : "userId"
    - value : 866: 2 elements
    - key : "otherNotes"
    - value : "Hello"

7

নীচের [String:Any]পরিবর্তে ব্যবহারকারীদের Dictionaryজন্য এক্সটেনশন

extension Dictionary where Key == String, Value == Any {

    mutating func append(anotherDict:[String:Any]) {
        for (key, value) in anotherDict {
            self.updateValue(value, forKey: key)
        }
    }
}

4

সুইফট 5 হিসাবে, নিম্নলিখিত কোড সংগ্রহ কাজ করে।

 // main dict to start with
 var myDict : Dictionary = [ 1 : "abc", 2 : "cde"]

 // dict(s) to be added to main dict
 let myDictToMergeWith : Dictionary = [ 5 : "l m n"]
 let myDictUpdated : Dictionary = [ 5 : "lmn"]
 let myDictToBeMapped : Dictionary = [ 6 : "opq"]

 myDict[3]="fgh"
 myDict.updateValue("ijk", forKey: 4)

 myDict.merge(myDictToMergeWith){(current, _) in current}
 print(myDict)

 myDict.merge(myDictUpdated){(_, new) in new}
 print(myDict)

 myDictToBeMapped.map {
     myDict[$0.0] = $0.1
 }
 print(myDict)

4

অভিধানে ডেটা যুক্ত করার জন্য কোনও ফাংশন নেই। আপনি কেবল বিদ্যমান অভিধানে নতুন কীটির বিপরীতে মান নির্ধারণ করুন। এটি স্বয়ংক্রিয়ভাবে অভিধানের মান যোগ করবে।

var param  = ["Name":"Aloha","user" : "Aloha 2"]
param["questions"] = "Are you mine?"
print(param)

আউটপুট মত হবে

["নাম": "আলো", "ব্যবহারকারী": "আলো 2", "প্রশ্ন": "" আপনি কি আমার "?"]


3
For whoever reading this for swift 5.1+

  // 1. Using updateValue to update the given key or add new if doesn't exist


    var dictionary = [Int:String]()    
    dictionary.updateValue("egf", forKey: 3)



 // 2. Using a dictionary[key]

    var dictionary = [Int:String]()    
    dictionary[key] = "value"



 // 3. Using subscript and mutating append for the value

    var dictionary = [Int:[String]]()

    dictionary[key, default: ["val"]].append("value")

2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "sample@email.com"
print(dict)

1
দয়া করে কিছু তথ্য সরবরাহ করুন কেন এই উত্তরটি সমস্যার সমাধান করে
স্টিফেন রিইন্ডল

@ স্টেফেনরেইন্ডল যদি আপনি এটি চালনা করেন তবে আপনি দেখতে পাবেন;)
বেন লেগিগেরো


0

এখন অবধি আমি সুইফটের উচ্চতর অর্ডার ফাংশনগুলির একটিতে "হ্রাস" ব্যবহার করে একটি অভিধানে ডেটা যুক্ত করার সেরা উপায়টি খুঁজে পেয়েছি। নীচে কোড স্নিপেট অনুসরণ করুন:

newDictionary = oldDictionary.reduce(*newDictionary*) { r, e in var r = r; r[e.0] = e.1; return r }

@ ধর্মেশ আপনার ক্ষেত্রে, এটি হবে,

newDictionary = dict.reduce([3 : "efg"]) { r, e in var r = r; r[e.0] = e.1; return r }

আপনি যদি উপরের সিনট্যাক্সটি ব্যবহার করতে কোনও সমস্যা পান তবে আমাকে জানান।



-1

আমি অভিধান এক্সটেনশন যুক্ত করেছি

extension Dictionary {   
  func cloneWith(_ dict: [Key: Value]) -> [Key: Value] {
    var result = self
    dict.forEach { key, value in result[key] = value }
    return result  
  }
}

আপনি cloneWithএই মত ব্যবহার করতে পারেন

 newDictionary = dict.reduce([3 : "efg"]) { r, e in r.cloneWith(e) }

-10

আপনি যদি এনএসডেটরিয়টি সংশোধন করতে বা আপডেট করতে চান তবে প্রথমে এটি টাইপকেস্ট করুন এনএসএমটেবলড অভিধান হিসাবে

let newdictionary = NSDictionary as NSMutableDictionary

তারপরে সহজভাবে ব্যবহার করুন

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