ठीक है, मैं तेजी से 3 संगतता के लिए अपना उत्तर अपडेट करने जा रहा हूं।
जब आप प्रोग्रामिंग कर रहे हैं तो आपको संग्रह के अंदर मौजूद वस्तुओं के कुछ मूल्यों को बदलने की आवश्यकता है। इस उदाहरण में हमारे पास संरचना की एक सरणी है और एक शर्त दी गई है जिसे हमें किसी विशिष्ट वस्तु के मान को बदलने की आवश्यकता है। किसी भी विकास दिवस में यह एक बहुत ही आम बात है।
यह निर्धारित करने के लिए कि कौन सा ऑब्जेक्ट संशोधित किया जाना है, एक इंडेक्स का उपयोग करने के बजाय मैं एक शर्त का उपयोग करना पसंद करता हूं, जो आईएमएचओ अधिक आम है।
import Foundation
struct MyStruct: CustomDebugStringConvertible {
var myValue:Int
var debugDescription: String {
return "struct is \(myValue)"
}
}
let struct1 = MyStruct(myValue: 1)
let struct2 = MyStruct(myValue: 2)
let structArray = [struct1, struct2]
let newStructArray = structArray.map({ (myStruct) -> MyStruct in
// You can check anything like:
if myStruct.myValue == 1 {
var modified = myStruct
modified.myValue = 400
return modified
} else {
return myStruct
}
})
debugPrint(newStructArray)
सभी अनुमतियों पर ध्यान दें, विकास का यह तरीका सुरक्षित है।
कक्षाएं संदर्भ प्रकार हैं, मूल्य बदलने के लिए प्रतिलिपि बनाने की आवश्यकता नहीं है, जैसे यह structs के साथ होता है। कक्षाओं के साथ एक ही उदाहरण का उपयोग करना:
class MyClass: CustomDebugStringConvertible {
var myValue:Int
init(myValue: Int){
self.myValue = myValue
}
var debugDescription: String {
return "class is \(myValue)"
}
}
let class1 = MyClass(myValue: 1)
let class2 = MyClass(myValue: 2)
let classArray = [class1, class2]
let newClassArray = classArray.map({ (myClass) -> MyClass in
// You can check anything like:
if myClass.myValue == 1 {
myClass.myValue = 400
}
return myClass
})
debugPrint(newClassArray)
भी देखें [मूल्य प्रकार बनाम वर्ग प्रकार] (http://stackoverflow.com/a/41353620/5175709) रोब सही ढंग से कहते हैं: * यदि आप एक विधि है कि तब होता है के लिए एक पैरामीटर के रूप में एक मान प्रकार पारित किसी अन्य धागे पर कुछ, आप अनिवार्य रूप से उस मूल्य प्रकार की ** प्रति ** ** के साथ काम कर रहे हैं। यह विधि को पारित उस वस्तु की अखंडता सुनिश्चित करता है। * – Honey