সুইফ্ট এবং মিউটরিং স্ট্রাক্ট


101

এমন কিছু আছে যা আমি যখন পুরোপুরি বুঝতে পারি না যখন এটি সুইফটে মান ধরণের পরিবর্তনের ক্ষেত্রে আসে।

"দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ" আইবুক যেমন বলেছে: ডিফল্টরূপে, একটি মান ধরণের বৈশিষ্ট্যগুলি তার উদাহরণ পদ্ধতিগুলির মধ্যে থেকে পরিবর্তন করা যায় না।

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

আমার কাছে যে বিষয়টি পুরোপুরি পরিষ্কার নয় তা হ'ল: আপনি কাঠামোর বাইরে থেকে কোনও বৈচিত্র পরিবর্তন করতে পারেন, তবে আপনি এটি নিজস্ব পদ্ধতি থেকে পরিবর্তন করতে পারবেন না। এটি আমার কাছে পাল্টা স্বজ্ঞাত হিসাবে মনে হয়, যেমন অবজেক্ট ওরিয়েন্টেড ভাষাগুলিতে আপনি সাধারণত ভেরিয়েবলগুলি এনপ্যাপুলেট করার চেষ্টা করেন যাতে সেগুলি কেবলমাত্র এর মধ্যে থেকে পরিবর্তন করা যায়। স্ট্রাক্টগুলির সাথে এটি অন্যভাবে দেখা যায়। বিস্তারিতভাবে বলতে গেলে এখানে একটি কোড স্নিপেট রয়েছে:

struct Point {
    var x = 0, y = 0
    mutating func moveToX(x: Int, andY y:Int) { //Needs to be a mutating method in order to work
        self.x = x
        self.y = y
    }
}

var p = Point(x: 1, y: 2)
p.x = 3 //Works from outside the struct!
p.moveToX(5, andY: 5) 

স্ট্রাইকগুলি তাদের নিজস্ব প্রসঙ্গের অভ্যন্তর থেকে সামগ্রীগুলি পরিবর্তন করতে না পারার কারণটি কি কেউ জানেন, যখন সামগ্রীগুলি সহজেই অন্য কোথাও পরিবর্তন করা যেতে পারে?

উত্তর:


85

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

মান একটি চপল স্টোরেজ (আমরা একে বলতে নির্ধারিত হয় তাহলে varবা পরিবর্তনশীল সুইফট), তবে আপনি তাদের রাষ্ট্র পরিবর্তন করা, এবং পদ্ধতি mutating এর কলিং অনুমোদিত হয়।

এছাড়াও, ক্লাসগুলির এই অপরিবর্তনীয় / পরিবর্তনযোগ্য মোড নেই। আইএমও, কারণ ক্লাসগুলি সাধারণত রেফারেন্স-সক্ষম সত্তাকে উপস্থাপন করতে ব্যবহৃত হয় । এবং রেফারেন্স-সক্ষম সত্তা সাধারণত পরিবর্তনযোগ্য কারণ সঠিক পারফরম্যান্সের সাথে অদলবস্তুর সংস্থাগুলির রেফারেন্স গ্রাফ তৈরি করা এবং পরিচালনা করা খুব শক্ত। তারা এই বৈশিষ্ট্যটি পরে যুক্ত করতে পারে তবে এখনই কমপক্ষে নয়।

অবজেক্টিভ-সি প্রোগ্রামারদের জন্য, পরিবর্তনীয় / অপরিবর্তনীয় ধারণাগুলি খুব পরিচিত। অবজেক্টিভ-সিতে প্রতিটি ধারণার জন্য আমাদের দুটি পৃথক ক্লাস ছিল তবে সুইফটে আপনি একটি স্ট্রাক্ট দিয়ে এটি করতে পারেন। অর্ধেক কাজ।

সি / সি ++ প্রোগ্রামারদের জন্য এটিও খুব পরিচিত ধারণা। constসি / সি ++ এ কীওয়ার্ডটি ঠিক এটি করে ।

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

হালনাগাদ

@ জোসেফ দাবি করেছেন যে এটি কেন দেয় না , আমি আরও কিছু যোগ করছি।

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

তারপরে, অপরিবর্তনীয় পদ্ধতিগুলি অবশ্যই এই অর্থগত অপরিবর্তনীয়তার গ্যারান্টি দেয় । যার অর্থ এটির কোনও অভ্যন্তরীণ মান পরিবর্তন করা উচিত নয়। সুতরাং সংকলক একটি পরিবর্তনযোগ্য পদ্ধতিতে নিজের কোনও রাজ্যের পরিবর্তনকে মঞ্জুরি দেয়। বিপরীতে, পরিবর্তনের পদ্ধতিগুলি রাষ্ট্রকে সংশোধন করতে মুক্ত।

এবং তারপরে, আপনার একটি প্রশ্ন থাকতে পারে কেন স্থায়ী কেন ডিফল্ট? এটি হ'ল পরিবর্তনের মানগুলির ভবিষ্যতের অবস্থা সম্পর্কে ভবিষ্যদ্বাণী করা খুব কঠিন এবং এটি সাধারণত মাথা ব্যথা এবং বাগের মূল উত্স হয়ে যায়। অনেক লোক সম্মত হন যে সমাধানটি পরিবর্তনীয় স্টাফগুলি এড়িয়ে চলেছে এবং তারপরে সি / সি ++ পারিবারিক ভাষা এবং এর উপকরণগুলি কয়েক দশক ধরে ইচ্ছার তালিকার উপরে ডিফল্টরূপে অপরিবর্তনীয় ছিল।

দেখুন বিশুদ্ধরূপে কার্মিক শৈলী আরো বিস্তারিত জানার জন্য। যাইহোক, আমাদের এখনও পরিবর্তনীয় স্টাফগুলির প্রয়োজন কারণ অপরিবর্তনীয় স্টাফগুলির কিছু দুর্বলতা রয়েছে এবং সেগুলি সম্পর্কে আলোচনা করা বিষয়টির বাইরে বলে মনে হয়।

আশা করি এটা কাজে লাগবে.


4
সুতরাং মূলত, আমি এটি এর মতো ব্যাখ্যা করতে পারি: কোনও কাঠামো আগে থেকেই জানে না এটি অন্যরকম পরিবর্তনযোগ্য বা অপরিবর্তনীয় হবে, সুতরাং এটি অন্যরকমভাবে না বললে অপরিবর্তনীয়তা ধরে নেয়। দেখেছি এটি সত্যিই অর্থবোধ করে। এটা কি সঠিক?
মাইক সেগ্রার

4
@ মাইকসেগারগুলি আমি মনে করি এটি উপলব্ধি করে।
ইওনিল

4
যদিও এটি দুটি জবাবের মধ্যে এখন পর্যন্ত সেরা, তবে আমি মনে করি না এটি কেন উত্তর দেয়, ডিফল্টরূপে, একটি মান ধরণের বৈশিষ্ট্যগুলি তার উদাহরণ পদ্ধতিগুলির মধ্যে থেকে পরিবর্তন করা যায় না। আপনি ইঙ্গিত দেন যে এটি কারণ স্ট্রাক্টগুলি পরিবর্তনযোগ্য হিসাবে ডিফল্ট হয় তবে আমি তা সত্য বলে মনে করি না
জোসেফ নাইট

4
@ জোসেফকেটনিট এটি এমন নয় যে স্থায়ীভাবে স্থির হয়ে যায় str এটি স্ট্রাইকগুলির পদ্ধতিগুলি স্থাবর-অযোগ্যের ডিফল্ট। বিপরীত ধারনা সহ এটিকে সি ++ এর মতো ভাবেন। সি ++ পদ্ধতিতে এটি অ-ধ্রুবকের ডিফল্টরূপে, আপনি যদি স্পষ্টভাবে constপদ্ধতিতে একটি 'কনস্ট কনটি' রাখতে চান এবং ধ্রুবক দৃষ্টান্তে অনুমতি পেতে চান (উদাহরণটি যদি কনস্ট্যান্ট হয় তবে সাধারণ পদ্ধতি ব্যবহার করা যাবে না)। বিপরীত ডিফল্টের সাথে সুইফট একই কাজ করে: একটি পদ্ধতিতে ডিফল্টরূপে 'কনস্ট কনস্ট' থাকে এবং আপনি যদি অন্যথায় স্থির দৃষ্টান্তের জন্য নিষেধ করতে হয় তবে তা চিহ্নিত করুন।
অ্যানালগ ফাইল

4
@ গোল্ডডভ হ্যাঁ, এবং আপনি পারবেন না। আপনার করা উচিত নয়। আপনার সর্বদা মানটির একটি নতুন সংস্করণ তৈরি করা বা অর্জন করা প্রয়োজন এবং আপনার প্রোগ্রামটি ইচ্ছাকৃতভাবে এটিকে অবলম্বন করার জন্য তৈরি করা দরকার। এই জাতীয় দুর্ঘটনাজনিত পরিবর্তন রোধ করার জন্য বৈশিষ্ট্যটি বিদ্যমান। আবার এটি কার্যকরী স্টাইল প্রোগ্রামিংয়ের অন্যতম মূল ধারণা ।
ইওনিল

26

একটি কাঠামো ক্ষেত্রের সমষ্টি; যদি কোনও নির্দিষ্ট কাঠামোর উদাহরণটি পরিবর্তনীয় হয় তবে এর ক্ষেত্রগুলি পরিবর্তনযোগ্য হবে; যদি কোনও উদাহরণ অপরিবর্তনীয় হয় তবে এর ক্ষেত্রগুলি পরিবর্তনযোগ্য হবে। কোনও নির্দিষ্ট উদাহরণের ক্ষেত্রগুলি পরিবর্তনীয় বা অপরিবর্তনীয় হতে পারে এমন সম্ভাবনার জন্য একটি কাঠামোর ধরণ অবশ্যই প্রস্তুত রাখতে হবে।

অন্তর্নিহিত কাঠামোর ক্ষেত্রগুলিকে পরিবর্তন করতে কোনও কাঠামোর পদ্ধতির জন্য, সেই ক্ষেত্রগুলিকে পরিবর্তনযোগ্য হতে হবে। অন্তর্নিহিত কাঠামোর ক্ষেত্রগুলিকে পরিবর্তিত করে এমন কোনও পদ্ধতি যদি একটি পরিবর্তনীয় কাঠামোর উপর আনা হয়, তবে তা অপরিবর্তনীয় ক্ষেত্রগুলিকে পরিবর্তনের চেষ্টা করবে। যেহেতু ভাল কিছুই আসতে পারে না, তাই এই জাতীয় অনুরোধ নিষিদ্ধ করা প্রয়োজন।

এটি অর্জনের জন্য, সুইফট কাঠামোগত পদ্ধতিগুলিকে দুটি বিভাগে বিভক্ত করে: এইগুলি যা অন্তর্নিহিত কাঠামোটি সংশোধন করে এবং এইভাবে কেবল পরিবর্তনীয় কাঠামোর দৃষ্টান্তগুলিতেই আহ্বান জানানো যেতে পারে এবং যেগুলি অন্তর্নিহিত কাঠামোটি সংশোধন করে না এবং এইভাবে পরিবর্তনীয় এবং অপরিবর্তনীয় উভয় দৃষ্টান্তেই অদৃশ্য হতে হবে should । পরবর্তী ব্যবহার সম্ভবত আরও ঘন ঘন এবং এটি ডিফল্ট।

তুলনা করে,। নেট বর্তমানে (তবুও!) কাঠামোগত পদ্ধতিগুলি পৃথক করে এমন কোনও উপায় সরবরাহ করে না যা কাঠামোগত পরিবর্তন করে না তাদের থেকে। পরিবর্তে, অপরিবর্তনীয় কাঠামোর উদাহরণে কোনও কাঠামো পদ্ধতির অনুরোধের ফলে সংকলকটি কাঠামোর উদাহরণের একটি পরিবর্তনীয় অনুলিপি তৈরি করতে পারে, পদ্ধতিটি এটির সাথে যা চায় তা করতে দিন এবং পদ্ধতিটি করা হয়ে গেলে অনুলিপিটি বাতিল করুন। এর ফলে কম্পাইলারটিকে কাঠামোটি অনুলিপি করতে সময় নষ্ট করতে বাধ্য করার পদ্ধতিটি কার্যকর হয় কিনা তা পদ্ধতিটি পরিবর্তিত করে, যদিও অনুলিপি অপারেশন যুক্ত করলে শব্দার্থ-ভুল কোডটি শব্দার্থ-সঠিক কোডে পরিণত হয় না; এটি কেবল এমন এক কোডের কারণ হয়ে দাঁড়ায় যা এককভাবে শব্দার্থগতভাবে ভুল হয় (একটি "স্থাবর" মান পরিবর্তন করে) অন্যভাবে ভুল হতে পারে (কোডটিকে এটি কোনও কাঠামোটি সংশোধন করছে বলে মনে করার অনুমতি দেয়, তবে চেষ্টা করা পরিবর্তনগুলি বাতিল করা হচ্ছে)। কাঠামোগত পদ্ধতিগুলি অন্তর্নিহিত কাঠামোটি সংশোধন করবে কিনা তা নির্দেশ করার মঞ্জুরি দিলে তা অনর্থক অনুলিপি অপারেশনের প্রয়োজনীয়তা অপসারণ করতে পারে, এবং এটিও নিশ্চিত করে যে ভ্রান্ত ব্যবহারের চেষ্টাটি পতাকাঙ্কিত হবে।


4
.NET এর সাথে তুলনা এবং একটি উদাহরণ যা মুভিং কীওয়ার্ডটি নেই তা আমার কাছে পরিষ্কার করে দিয়েছে। পরিবর্তনের কীওয়ার্ডটি কোনও উপকার তৈরি করবে তার যুক্তি।
বাইনারিয়ান

22

সাবধানতা: সাধারণ ব্যক্তির শর্তাদি এগিয়ে।

এই ব্যাখ্যাটি সবচেয়ে নিটোল-গ্রিট কোড স্তরে কঠোরভাবে সঠিক নয়। তবে এটি এমন একজন ব্যক্তির দ্বারা পর্যালোচনা করা হয়েছে যা প্রকৃতপক্ষে সুইফটে কাজ করে এবং তিনি বলেছিলেন যে এটি একটি মৌলিক ব্যাখ্যা হিসাবে যথেষ্ট।

তাই আমি "কেন" প্রশ্নটির সহজ এবং সরাসরি উত্তর দেওয়ার চেষ্টা করতে চাই ।

সুনির্দিষ্টভাবে বলতে গেলে : কেন আমরা mutatingকোনও কাঠামো পরিবর্তিত কীওয়ার্ড ছাড়াই স্ট্রাক্ট প্যারামিটারগুলি পরিবর্তন করতে পারি যেমন স্ট্রাক্ট ফাংশনগুলি চিহ্নিত করতে হবে?

সুতরাং, বড় ছবি, এটি দর্শনের সাথে অনেক কিছু করার আছে যা সুইফটকে আরও দ্রুত রাখে

আপনি প্রকৃত শারীরিক ঠিকানাগুলি পরিচালনা করার সমস্যার মতো এটির মতো চিন্তা করতে পারেন। আপনি যখন আপনার ঠিকানা পরিবর্তন করেন, যদি আপনার বর্তমান একটি প্রচুর লোক থাকে তবে আপনাকে স্থানান্তরিত করা সমস্তকেই আপনাকে জানাতে হবে। তবে কারও কাছে যদি আপনার বর্তমান ঠিকানা না থাকে তবে আপনি যেখানেই চান সরে যেতে পারেন এবং কারও জানা দরকার নেই।

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

এই কারণেই সুইফট-লোকেরা মান সংক্রান্ত বনাম রেফারেন্স প্রকারগুলি সম্পর্কে সকলেই ভীত হয়। প্রকৃতি অনুসারে, রেফারেন্সের ধরণগুলি পুরো জায়গা জুড়ে "পরিচিতিগুলি" রাক আপ করে এবং মান ধরণের ক্ষেত্রে সাধারণত একটি দম্পতির বেশি প্রয়োজন হয় না। মান প্রকারগুলি হ'ল "সুইফ্ট" -র।

এত ছোট ছবি ফিরে: structs। স্টিফ্টগুলি সুইফটে একটি বড় বিষয় কারণ তারা বস্তুগুলি করতে পারে এমন বেশিরভাগ কাজ করতে পারে তবে তারা মান ধরণের।

আসুন এমন একটি বাসনা কল্পনা করে শারীরিক ঠিকানা উপমা চালিয়ে misterStructযান someObjectVille। সাদৃশ্যটি এখানে কিছুটা ডুবে যায় তবে আমি মনে করি এটি এখনও সহায়ক।

সুতরাং একটিতে একটি ভেরিয়েবল পরিবর্তন করতে মডেল করার জন্য struct, ধরা যাক misterStructসবুজ চুল রয়েছে এবং নীল চুলে স্যুইচ করার আদেশ পেয়েছে। সাদৃশ্যটি কৃপণ হয়ে ওঠে, যেমনটি আমি বলেছিলাম, তবে যা ঘটে তা হ'ল misterStructচুলের চুল বদলানোর পরিবর্তে বৃদ্ধ ব্যক্তিটি সরে যায় এবং নীল চুলযুক্ত একটি নতুন ব্যক্তি ভেতরে চলে যায় এবং সেই নতুন ব্যক্তি নিজেকে কল করতে শুরু করে misterStruct। কারও ঠিকানার বিজ্ঞপ্তি পরিবর্তন করার দরকার নেই, তবে যদি কেউ সেই ঠিকানার দিকে নজর দেয় তবে তারা নীল চুলের একটি লোক দেখতে পাবে।

এবার আসুন মডেল করা যাক আপনি যখন একটি ফাংশন কল করেন তখন কি হয় struct। এই ক্ষেত্রে, এটি misterStructযেমন একটি অর্ডার পেতে মত changeYourHairBlue()। সুতরাং পোস্ট অফিস misterStruct"আপনার চুলের নীল রঙ পরিবর্তন করুন এবং আপনার কাজ শেষ হয়ে গেলে আমাকে বলুন" নির্দেশনা সরবরাহ করে ।

যদি সে আগের মতোই রুটিন অনুসরণ করে থাকে, যদি ভেরিয়েবলটি সরাসরি পরিবর্তিত হওয়ার সময় সে কী করে, তবে সে কী misterStructকরবে তার নিজের বাড়ি থেকে বেরিয়ে এসে নীল চুলের সাথে একটি নতুন ব্যক্তিকে ডাকবে। তবে এটাই সমস্যা।

অর্ডারটি ছিল "আপনার চুলকে নীলতে পরিবর্তন করুন এবং আপনার কাজ শেষ হয়ে গেলে আমাকে বলুন", তবে এটি সেই সবুজ লোক যিনি সেই আদেশ পেয়েছিলেন। নীল লোকটি প্রবেশের পরে, একটি "কাজ সম্পূর্ণ" বিজ্ঞপ্তিটি এখনও ফেরত পাঠাতে হবে। তবে নীল লোকটি এ সম্পর্কে কিছুই জানে না।

[এই উপমাটি সত্যই ভয়ঙ্কর কিছুটি জাগিয়ে তোলার জন্য, সবুজ কেশিক ছেলেটির সাথে প্রযুক্তিগতভাবে যা ঘটেছিল তা হ'ল তিনি চলে যাওয়ার পরে অবিলম্বে তিনি আত্মহত্যা করেছিলেন। সুতরাং তিনি কাউকেই অবহিত করতে পারবেন না যে টাস্কটি সম্পূর্ণ হয়েছে ! ]

এই সমস্যাটি এড়াতে, কেবল এই জাতীয় ক্ষেত্রে , সুইফ্টকে সরাসরি ঠিকানায় ঠিক সেই ঠিকানায় প্রবেশ করতে হবে এবং প্রকৃতপক্ষে বর্তমান বাসিন্দার চুল বদলাতে হবে । এটি কোনও নতুন লোককে প্রেরণ করার চেয়ে সম্পূর্ণ ভিন্ন প্রক্রিয়া।

আর এই কারণেই সুইফ্ট আমাদের mutatingকীওয়ার্ডটি ব্যবহার করতে চায় !

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

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

সংক্ষেপে, সুইফটকে দ্রুত চলতে সহায়তা করতে আমাদের সকলকে অবশ্যই আমাদের অংশটি করা উচিত। :)


4
এটি এত <<- ওয়ার্ড- এখানে> আশ্চর্যরকম লেখা! সুতরাং, বুঝতে এত সহজ। আমি এটির জন্য ইন্টারনেট স্ক্রোল করেছি এবং উত্তরটি এখানে রয়েছে (ভাল, যাইহোক উত্স কোডের মাধ্যমে না যাওয়া)। এটি লেখার জন্য সময় দেওয়ার জন্য অনেক ধন্যবাদ।
বৈভব

4
আমি কেবল এটি নিশ্চিত করেই বুঝতে চাই যে আমি এটি সঠিকভাবে বুঝতে পেরেছি: আমরা কী বলতে পারি যে যখন কোনও স্ট্রাক্ট উদাহরণের কোনও সম্পত্তি সরাসরি সুইফটে পরিবর্তিত হয় তখন স্ট্রাক্টের সেই উদাহরণটি "সমাপ্ত" হয় এবং পরিবর্তিত সম্পত্তি সহ একটি নতুন উদাহরণ "তৈরি করা হয়" দৃশ্যের অন্তরালে? এবং যখন আমরা সেই উদাহরণটির সম্পত্তি পরিবর্তন করার জন্য দৃষ্টান্তের মধ্যে কোনও পরিবর্তক পদ্ধতি ব্যবহার করি, তখন এই সমাপ্তি এবং পুনরায় সূচনা প্রক্রিয়াটি ঘটে না?
টেড

@ টিও, আমি আশা করি আমি স্পষ্টভাবে উত্তর দিতে পারতাম, তবে আমি সর্বোত্তম বলতে পারি যে আমি এই সাদৃশ্যটি একজন প্রকৃত সুইফট বিকাশকারীকে পেরিয়ে গিয়েছি এবং তারা বলেছিল "এটি মূলত সঠিক", এটি বোঝায় যে প্রযুক্তিগত দিক থেকে এর আরও কিছু আছে। তবে সেই বোঝার সাথে - এটির তুলনায় এটি আরও অনেক কিছু রয়েছে - বিস্তৃত অর্থে, হ্যাঁ, এটি এই উপমাটি যা বলে চলেছে।
লে মোট জুসেড

8

সুইফ্ট স্ট্রাক্টগুলি কনস্ট্যান্ট (মাধ্যমে let) বা ভেরিয়েবল (মাধ্যমে var) হিসাবে ইনস্ট্যান্ট করা যেতে পারে

সুইফটের Arrayস্ট্রাক্ট বিবেচনা করুন (হ্যাঁ এটি স্ট্রাক্ট)।

var petNames: [String] = ["Ruff", "Garfield", "Nemo"]
petNames.append("Harvey") // ["Ruff", "Garfield", "Nemo", "Harvey"]

let planetNames: [String] = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
planetNames.append("Pluto") //Error, sorry Pluto. No can do

গ্রহের নামের সাথে সংযোজন কেন কাজ করল না? কারণ সংযুক্তিটি মূলশব্দটির সাথে চিহ্নিত mutating। এবং যেহেতু planetNamesব্যবহারের ঘোষিত হয়েছিল let, সুতরাং চিহ্নিত সমস্ত পদ্ধতি সীমা ছাড়াই।

আপনার উদাহরণে সংকলক বলতে পারবেন যে আপনি কোনওটির বাইরে বা তার আরও একাধিক বৈশিষ্ট্য নির্ধারণ করে স্ট্রাক্টটি পরিবর্তন করছেন init। আপনি যদি আপনার কোডটি কিছুটা পরিবর্তন করেন তবে আপনি এটি দেখতে পাবেন xএবং yকাঠামোর বাইরে সর্বদা অ্যাক্সেসযোগ্য নয়। letপ্রথম লাইনে লক্ষ্য করুন ।

let p = Point(x: 1, y: 2)
p.x = 3 //error
p.moveToX(5, andY: 5) //error

5

সি ++ সহ একটি উপমা বিবেচনা করুন। সুইফটে থাকা mutating/ না- এর একটি স্ট্রাক্ট পদ্ধতি mutatingসি ++ নন- const/ হওয়াতে একটি পদ্ধতির সাথে সাদৃশ্য constconstসি ++ তে চিহ্নিত একটি পদ্ধতি একইভাবে স্ট্রাকটিকে রূপান্তর করতে পারে না।

আপনি স্ট্রকের বাইরে থেকে কোনও বৈচিত্র পরিবর্তন করতে পারেন, তবে আপনি এটি নিজস্ব পদ্ধতি থেকে পরিবর্তন করতে পারবেন না।

সি ++ এ আপনি "স্ট্রাক্টের বাইরের থেকে কোনও রূপ পরিবর্তন করতে পারেন" - তবে কেবল যদি আপনার constস্ট্রাক্ট- নন ভেরিয়েবল থাকে। আপনার যদি constস্ট্রাক ভেরিয়েবল থাকে তবে আপনি কোনও ভারতে বরাদ্দ করতে পারবেন না এবং আপনি কোনও নন-মেথডও কল করতে পারবেন না const। একইভাবে, সুইফ্টে, আপনি যদি স্ট্রাকের ভেরিয়েবলটি ধ্রুবক না হন তবেই আপনি কোনও কাঠামোর সম্পত্তি পরিবর্তন করতে পারেন। আপনার যদি স্ট্রাক্ট ধ্রুবক থাকে তবে আপনি কোনও সম্পত্তি বরাদ্দ করতে পারবেন না এবং কোনও mutatingপদ্ধতিতে কলও করতে পারবেন না ।


1

আমি একই জিনিসটি অবাক করেছিলাম যখন আমি সুইফট শিখতে শুরু করেছি, এবং এই উত্তরগুলির প্রতিটি, সম্ভবত কিছু অন্তর্দৃষ্টি যুক্ত করার সময়, একদম শব্দযুক্ত এবং বিভ্রান্তিকর নিজস্ব in আমি মনে করি আপনার প্রশ্নের উত্তর আসলে খুব সহজ…

আপনার কাঠামোর অভ্যন্তরে সংজ্ঞায়িত রূপান্তর পদ্ধতিটি নিজের এবং প্রতিটি ঘটনাকেই ভবিষ্যতে কখনও তৈরি করার অনুমতি চেয়েছে। যদি সেই দৃষ্টান্তগুলির মধ্যে একটির সাথে একটি অপরিবর্তনীয় ধ্রুবককে অর্পণ করা হয় তবে কী হবে let? আহ ওহ. নিজেকে থেকে নিজেকে রক্ষা করতে (এবং সম্পাদক এবং সংকলক আপনি কী করতে চাইছেন তা জানতে ), আপনি যখন কোনও উদাহরণ পদ্ধতিটি এই ধরণের শক্তি দিতে চান তখন আপনাকে স্পষ্ট হতে বাধ্য করতে হবে।

বিপরীতে, আপনার স্ট্রাক্টের বাইরে থেকে কোনও সম্পত্তির সেটিং সেই স্ট্রাক্টের একটি পরিচিত উদাহরণে কাজ করছে। যদি এটি একটি ধ্রুবককে অর্পণ করা হয় তবে এক্সকোড আপনাকে পদ্ধতি কলটিতে যে মুহুর্তটি টাইপ করেছে সেই মুহূর্তে আপনাকে এটি সম্পর্কে জানাতে দেবে।

আমি সুইফটকে এই বিষয়গুলিতে বেশি ভালবাসি যেহেতু আমি আরও বেশি ব্যবহার শুরু করি — ত্রুটিগুলি টাইপ করার সাথে সাথে সতর্ক করা হচ্ছে। নিশ্চয়ই জাভাস্ক্রিপ্ট বাগের সমস্যা সমাধানের জন্য হ্যাককে মারধর করেছেন!


1

সুইফট: স্ট্রাক্টসে মিউটিং ফাংশনের ব্যবহার

সুইফ্ট প্রোগ্রামাররা স্ট্রাক্টগুলি এমনভাবে বিকাশ করেছিল যাতে স্ট্রাক্ট পদ্ধতির মধ্যে এর বৈশিষ্ট্যগুলি পরিবর্তন করা যায় না। উদাহরণস্বরূপ, নীচে দেওয়া কোডটি চেক করুন

struct City
{
  var population : Int 
  func changePopulation(newpopulation : Int)
  {
      population = newpopulation //error: cannot modify property "popultion"
  }
}
  var mycity = City(population : 1000)
  mycity.changePopulation(newpopulation : 2000)

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

আমরা কীভাবে এটি সমাধান করব? বিকল্প কি?

মিউটটিং কীওয়ার্ড:

স্ট্রাক্টের অভ্যন্তরে পরিবর্তন হিসাবে ফাংশন ঘোষণা আমাদের স্ট্রাক্টের বৈশিষ্ট্যগুলিকে পরিবর্তন করতে দেয়। উপরের কোডগুলির মধ্যে লাইন নং: 5, এর মত পরিবর্তন হয়,

mutating changePopulation(newpopulation : Int)

এখন আমরা পদ্ধতির আওতায় সম্পত্তি সংখ্যায় নতুন জনসংখ্যার মান নির্ধারণ করতে পারি ।

বিঃদ্রঃ :

let mycity = City(1000)     
mycity.changePopulation(newpopulation : 2000)   //error: cannot modify property "popultion"

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

আপনার মতামত এবং চিন্তা শুনতে ভাল লাগবে… ..

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