स्विफ्ट में अपरिवर्तनीय / पारस्परिक संग्रह


88

मैं स्विफ्ट भाषा में म्यूटेबल / अपरिवर्तनीय वस्तुओं (एरे, डिक्शनरी, सेट्स, डेटा) के निर्माण के लिए एप्पल की स्विफ्ट प्रोग्रामिंग गाइड का जिक्र कर रहा था। लेकिन मैं समझ नहीं पा रहा था कि स्विफ्ट में एक संग्रहणीय संग्रह कैसे बनाया जाए।

मैं ऑब्जेक्टिव-सी में निम्नलिखित के लिए स्विफ्ट में समकक्ष देखना चाहूंगा

अपरिवर्तनीय ऐरे

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];

म्यूटेबल ऐरे

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];

अपरिवर्तनीय शब्दकोश

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];

म्यूटेबल डिक्शनरी

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];

जवाबों:


115

Arrays

अपरिवर्तनीय सरणी बनाएँ

पहला तरीका:

let array = NSArray(array: ["First","Second","Third"])

दूसरा तरीका:

let array = ["First","Second","Third"]

उत्परिवर्तित सरणी बनाएँ

var array = ["First","Second","Third"]

सरणी के लिए ऑब्जेक्ट जोड़ें

array.append("Forth")


शब्दकोश

अपरिवर्तनीय शब्दकोश बनाएं

let dictionary = ["Item 1": "description", "Item 2": "description"]

उत्परिवर्ती शब्दकोश बनाएं

var dictionary = ["Item 1": "description", "Item 2": "description"]

शब्दकोश में नई जोड़ी को जोड़ो

dictionary["Item 3"] = "description"

Apple डेवलपर पर अधिक जानकारी


12
"निश्चित लंबाई" सरणी अधिक सटीक होगी। यह अपरिवर्तनीय नहीं है।
सुल्तान

1
अपरिवर्तनीय Dictionaryवास्तव में अपरिवर्तनीय है (ऐरे के विपरीत)
ब्रायन चेन

@BryanChen ओह .. धन्यवाद!
निकेल

@BryanChen हां, मैं निकालना भूल गया var
निकेल

2
हाँ। इस प्रश्न और इसके उत्तर में सरणियों की अन-अपरिवर्तनीयता के बारे में अधिक जानकारी ।
मैट गिब्सन

31

NSArrayउद्देश्य-सी में स्विफ्ट के पास या अन्य संग्रह वर्गों के प्रतिस्थापन में कोई गिरावट नहीं है।

सरणी और शब्दकोश कक्षाएं हैं, लेकिन यह ध्यान दिया जाना चाहिए कि ये "मूल्य" प्रकार हैं, एनएसएरे और एनएसबर्ड की तुलना में "ऑब्जेक्ट" प्रकार हैं।

अंतर सूक्ष्म है लेकिन एज केस बग्स से बचने के लिए बहुत महत्वपूर्ण हो सकता है।

तेजी से, आप एक "अपरिवर्तनीय" सरणी बनाते हैं:

let hello = ["a", "b", "c"]

और एक "परस्पर" सरणी के साथ:

var hello = ["a", "b", "c"]

म्यूटेबल सरणियों को उसी तरह संशोधित किया जा सकता है NSMutableArray:

var myArray = ["a", "b", "c"]

myArray.append("d") // ["a", "b", "c", "d"]

हालाँकि आप किसी फ़ंक्शन के लिए एक परिवर्तनशील सरणी पास नहीं कर सकते हैं:

var myArray = ["a", "b", "c"]

func addToArray(myArray: [String]) {
  myArray.append("d") // compile error
}

लेकिन उपरोक्त कोड एक NSMutableArray के साथ काम करता है:

var myArray = ["a", "b", "c"] as NSMutableArray

func addToArray(myArray: NSMutableArray) {
  myArray.addObject("d")
}

addToArray(myArray)

myArray // ["a", "b", "c", "d"]

आप NSMutableArrayएक inoutविधि पैरामीटर का उपयोग करके व्यवहार प्राप्त कर सकते हैं :

var myArray = ["a", "b", "c"]

func addToArray(inout myArray: [String]) {
  myArray.append("d")
}

addToArray(&myArray)

myArray // ["a", "b", "c", "d"]

वर्तमान स्विफ्ट व्यवहार को प्रतिबिंबित करने के लिए 2015-08-10 का यह उत्तर फिर से लिखा गया।


1
यह स्पष्ट रूप से अब बदल दिया गया है। एक निरंतर सरणी अब वास्तव में अपरिवर्तनीय है, और एक चर सरणी अब वास्तव में परिवर्तनशील है। उन्हें मूल्यों के रूप में पारित किया जाता है , इसलिए जब किसी अन्य चर को सौंपा जाता है या कार्यों के बीच पारित किया जाता है , तो उन्हें कॉपी किया जाएगा। यह, हालांकि, परिवर्तनशीलता या अपरिवर्तनीयता से कोई लेना-देना नहीं है।
बलथाजर

जैसा कि मैंने अपने उत्तर में उल्लेख किया है, मूल्यों के रूप में पारित किया जाना पारस्परिकता / अपरिवर्तनीयता के लिए प्रासंगिक है क्योंकि आप केवल उसी समय के बारे में परवाह करते हैं जब किसी अन्य कोड के लिए एक सरणी पास कर रहा है (जो इसे संशोधित कर सकता है)।
अभि बेकर्ट

लेकिन यदि आप एक संपत्ति के रूप में सरणी तक पहुंचते हैं, तो आप अभी भी इसे किसी अन्य ऑब्जेक्ट से संशोधित कर सकते हैं। एक अपरिवर्तनीय सरणी के लाभों में से एक यह है कि आप इसे सुरक्षित रूप से किसी अन्य ऑब्जेक्ट को पास कर सकते हैं, बिना यह चिंता किए कि क्या अन्य ऑब्जेक्ट मूल को संशोधित कर सकता है। जब वस्तुएं मानों के रूप में पारित की जाती हैं तो यह चिंता अब मौजूद नहीं है। तो, अलग-अलग शब्दार्थों को अलग-अलग कोडिंग प्रथाओं की आवश्यकता होती है। संपादित करें: अब मैं देख रहा हूं कि आपने पोस्ट पुन: पोस्ट कर दी है, इसलिए हम सहमत हैं। मैं मानता हूं कि मतभेदों के बारे में पता होना ज़रूरी है। परस्पर संग्रह का उपयोग।
Balthazar

6

स्विफ्ट में केवल एक Arrayऔर एक Dictionaryप्रकार है। परिवर्तनशीलता इस बात पर निर्भर करती है कि आप इसका निर्माण कैसे करते हैं:

var mutableArray = [1,2,3]
let immutableArray = [1,2,3]

यदि आप किसी वैरिएबल को असाइन करते हैं, तो यह परिवर्तनशील होता है, जबकि यदि आप एक असेंबली को बनाते हैं तो यह नहीं है।

चेतावनी: अपरिवर्तनीय सरणियाँ पूरी तरह से अपरिवर्तनीय नहीं हैं! आप अभी भी उनकी सामग्री बदल सकते हैं, केवल उनकी समग्र लंबाई नहीं!


1
FYI करें: आगामी बीटा में सरणी व्यवहार बदल रहा है; मुझे लगता है कि हर किसी ने उस एक के बारे में ढेर कर दिया
russbishop

@xenadu स्रोत? उस बीटा पर ईटीए
एनालॉग फाइल

क्षमा करें, कोई स्रोत नहीं। यह एक संकलक टीम के सदस्यों के साथ चर्चा से आया था। उन्होंने यह भी कहा कि बीटा 2 मूल रूप से बग फिक्स में पहले से ही जाँच की गई जोड़ी थी और डब्ल्यूडब्ल्यूडीसी की प्रतिक्रिया से संबंधित कुछ भी नहीं है।
रुसबिशॉप

5

बस अपनी (किसी भी) वस्तु या चर को घोषित करें

'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.

तथा

'var' key word -> for "Mutable" array, dictionary, variable, object..etc. 

अधिक गहन जानकारी के लिए

"उपयोग करते हैं एक स्थिर और बनाने के लिए वर एक चर बनाने के लिए। किसी स्थिरांक का मूल्य संकलन समय पर ज्ञात होने की आवश्यकता नहीं है, लेकिन आपको इसे एक बार बिल्कुल एक मान निर्दिष्ट करना होगा। इसका मतलब है कि आप स्थिरांक का उपयोग उस मूल्य को नाम देने के लिए कर सकते हैं जिसे आप एक बार निर्धारित करते हैं लेकिन कई स्थानों पर उपयोग करते हैं। "

var myVariable = 42
myVariable = 50
let myConstant = 42

पढ़ें "स्विफ्ट प्रोग्रामिंग भाषा।"


ठीक है, एक ऐरे के मामले में यह अपेक्षा के अनुरूप काम नहीं करता है। stackoverflow.com/a/24319712/623710
macshome 20

3

यदि आप Array(स्विफ्ट) के साथ काम करना चाहते हैं NSArray, तो आप एक साधारण पुल फ़ंक्शन का उपयोग कर सकते हैं। उदाहरण:

var arr1 : Array = []

arr1.bridgeToObjectiveC().count

यह उसी के लिए काम करता है let


0

Apple के अपने डॉक्स से:

संग्रह की क्षमता

यदि आप एक सरणी, एक सेट, या एक शब्दकोश बनाते हैं और इसे एक चर के लिए असाइन करते हैं, तो जो संग्रह बनाया जाता है वह परिवर्तनशील होगा। इसका मतलब यह है कि आप संग्रह में आइटम जोड़ने, हटाने या बदलने के बाद संग्रह को बदल सकते हैं (या म्यूट कर सकते हैं)। इसके विपरीत, यदि आप किसी सरणी, एक सेट, या एक शब्दकोश को एक स्थिरांक पर असाइन करते हैं, तो वह संग्रह अपरिवर्तनीय है, और इसका आकार और सामग्री नहीं बदली जा सकती।

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105

अपरिवर्तनीय / परिवर्तनशील संग्रहों के अन्य उपयोग इस बात पर निर्भर करते हैं कि आप उन्हें उत्परिवर्तित / अपरिवर्तनीय क्यों बनाना चाहते हैं। संग्रह स्विफ्ट में मूल्य प्रकार हैं , जिसका अर्थ है कि उनकी सामग्री की नकल तब की जाती है जब उन्हें दूसरे मूल्य पर सौंपा जाता है, या किसी अन्य फ़ंक्शन / विधि को पारित किया जाता है। इसलिए, आपको इस बारे में चिंता करने की ज़रूरत नहीं है कि क्या प्राप्त करने का तरीका फ़ंक्शन मूल सरणी को बदल सकता है। इसलिए आपको एक अपरिवर्तनीय संग्रह वापस करने के लिए सुनिश्चित करने की आवश्यकता नहीं है यदि आपकी कक्षा उदाहरण के लिए, एक परिवर्तनशील संग्रह रखती है।


0

[अपरिवर्तनीय और अपरिवर्तनीय]

स्विफ्ट का एरे म्यूट किया जा सकता है

[चलो बनाम var, मान बनाम संदर्भ प्रकार]

अपरिवर्तनीय संग्रह [के बारे में] - एक संग्रह संरचना है, जिसे बदला नहीं जा सकता है। इसका मतलब है कि आप निर्माण के बाद जोड़, हटा, संशोधित नहीं कर सकते

let + struct(जैसे Array, Set, Dictionary) अधिक उपयुक्त अपरिवर्तनीय हो रहा है

कुछ वर्ग (जैसे NSArray) हैं जो आंतरिक स्थिति को बदलने के लिए एक इंटरफ़ेस प्रदान नहीं करते हैं

परंतु

class A {
    var value = "a"
}

func testMutability() {
    //given
    let a = A()
    
    let immutableArr1 = NSArray(array: [a])
    let immutableArr2 = [a]
    
    //when
    a.value = "aa"
    
    //then
    XCTAssertEqual("aa", (immutableArr1[0] as! A).value)
    XCTAssertEqual("aa", immutableArr2[0].value)
}   

बल्कि यह unmodifiableसरणी है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.