আমি কীভাবে একটি অ্যারের হুবহু নকল করব?
সুইফটে একটি অ্যারের সদৃশ করার বিষয়ে তথ্য পেতে আমার বেশ কষ্ট হচ্ছে।
আমি ব্যবহার করার চেষ্টা করেছি .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
আমি কীভাবে একটি অ্যারের হুবহু নকল করব?
সুইফটে একটি অ্যারের সদৃশ করার বিষয়ে তথ্য পেতে আমার বেশ কষ্ট হচ্ছে।
আমি ব্যবহার করার চেষ্টা করেছি .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
উত্তর:
অ্যারেগুলিতে সুইফটে পূর্ণ মান শব্দার্থক শব্দ রয়েছে, তাই অভিনব কোনও কিছুর প্রয়োজন নেই।
var duplicateArray = originalArray
আপনার যা দরকার তা হল।
যদি আপনার অ্যারের সামগ্রীগুলি কোনও রেফারেন্স টাইপ হয় তবে হ্যাঁ, এটি কেবলমাত্র আপনার অবজেক্টগুলিতে পয়েন্টারগুলি অনুলিপি করবে। বিষয়বস্তুগুলির একটি গভীর অনুলিপি সম্পাদন করার জন্য, আপনি পরিবর্তে map
প্রতিটি ইভেন্টের একটি অনুলিপি ব্যবহার এবং সম্পাদন করবেন। NSCopying
প্রোটোকল অনুসারে ফাউন্ডেশন ক্লাসগুলির জন্য , আপনি এই copy()
পদ্ধতিটি ব্যবহার করতে পারেন :
let x = [NSMutableArray(), NSMutableArray(), NSMutableArray()]
let y = x
let z = x.map { $0.copy() }
x[0] === y[0] // true
x[0] === z[0] // false
নোট করুন যে এখানে অসুবিধাগুলি রয়েছে যে সুইফ্টের মান শব্দার্থকগুলি আপনাকে from থেকে রক্ষা করতে কাজ করছে, উদাহরণস্বরূপ, যেহেতু NSArray
একটি পরিবর্তনযোগ্য অ্যারের প্রতিনিধিত্ব করে, এর copy
পদ্ধতিটি কেবল নিজের কাছে একটি রেফারেন্স দেয়, সুতরাং উপরের পরীক্ষায় অপ্রত্যাশিত ফলাফল পাওয়া যাবে।
var x = [UIView(), UIView(), UIView()] var y = x for i in x { NSLog("%p", i) } println("---") for i in y { NSLog("%p", i) }
এবং এই আউটপুটটি পেয়েছি: 0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770 ---0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770
এটি অনুলিপি করা হচ্ছে বলে মনে হচ্ছে না, আপনি কেন জানেন?
x[0] == x[1]
তবে x[0] === y[0]
ব্যর্থ হওয়া উচিত
নাট সঠিক। আপনি যদি আদিম অ্যারেগুলির সাথে কাজ করছেন তবে আপনাকে যা করতে হবে তা হ'ল মূলআরেতে সদৃশ অ্যারিকে অর্পণ করা।
সম্পূর্ণতার স্বার্থে, আপনি যদি এনএসআরাই অবজেক্টে কাজ করছিলেন তবে এনএসআরির সম্পূর্ণ অনুলিপিটি করতে নিম্নলিখিতগুলি করতে হবে:
var originalArray = [1, 2, 3, 4] as NSArray
var duplicateArray = NSArray(array:originalArray, copyItems: true)
নেটের উত্তরের তৃতীয় বিকল্প রয়েছে:
let z = x.map { $0 } // different array with same objects
* সম্পাদিত * সম্পাদনা এখানে শুরু হয়
উপরেরটি মূলত নীচের মত একই এবং প্রকৃতপক্ষে নীচের সাম্যতা অপারেটরটি ব্যবহার করা আরও ভাল সম্পাদন করবে কারণ অ্যারেটি পরিবর্তন না করা হলে অনুলিপি করা হবে না (এটি নকশা অনুসারে)।
let z = x
এখানে আরও পড়ুন: https://developer.apple.com/swift/blog/?id=10
* সম্পাদিত * সম্পাদনা এখানেই শেষ হয়
এই অ্যারেতে যুক্ত করা বা অপসারণ মূল অ্যারেটিকে প্রভাবিত করবে না। যাইহোক, অ্যারের ধারণ করে থাকা কোনও বস্তুর কোনও বৈশিষ্ট্য পরিবর্তন করে আসল অ্যারেতে দেখা যাবে। কারণ অ্যারেতে থাকা বস্তুগুলি অনুলিপিগুলি নয় (ধরে নেওয়া অ্যারে ধরে রাখা বস্তুগুলি, আদিম সংখ্যা নয়)।
var array1: [String] = ["john", "alan", "kristen"]; print(array1); var array2 = array1.map { $0 }; print(array2); array2[0] = "james"; print(array1); print(array2);
NSCopying
তবে একটি অ্যারের সদৃশ করুন:let z = x.map { $0.copy as! ClassX }
সাধারণ বস্তুর জন্য যা করা যায় তা হ'ল অনুলিপি সমর্থনকারী একটি প্রোটোকল বাস্তবায়ন করা এবং অবজেক্ট শ্রেণি এই প্রোটোকলটিকে এভাবে প্রয়োগ করে:
protocol Copying {
init(original: Self)
}
extension Copying {
func copy() -> Self {
return Self.init(original: self)
}
}
এবং তারপরে ক্লোনিংয়ের জন্য অ্যারে এক্সটেনশন:
extension Array where Element: Copying {
func clone() -> Array {
var copiedArray = Array<Element>()
for element in self {
copiedArray.append(element.copy())
}
return copiedArray
}
}
কোড এবং একটি নমুনা দেখতে এই টুকরোটি পরীক্ষা করে দেখুন
object's
আপনি যদি কিছু শ্রেণীর অবজেক্টের অ্যারের আইটেমগুলি অনুলিপি করতে চান তবে। তারপরে আপনি এনএসকোপিং প্রোটোকলটি ব্যবহার না করে নীচের কোডটি অনুসরণ করতে পারেন তবে আপনার একটি init পদ্ধতি থাকা দরকার যা আপনার অবজেক্টের জন্য প্রয়োজনীয় সমস্ত পরামিতি গ্রহণ করা উচিত। খেলার মাঠে পরীক্ষার জন্য উদাহরণের জন্য এখানে কোড।
class ABC {
var a = 0
func myCopy() -> ABC {
return ABC(value: self.a)
}
init(value: Int) {
self.a = value
}
}
var arrayA: [ABC] = [ABC(value: 1)]
var arrayB: [ABC] = arrayA.map { $0.myCopy() }
arrayB.first?.a = 2
print(arrayA.first?.a)//Prints 1
print(arrayB.first?.a)//Prints 2
var duplicateArray = originalArray