সুইফট পাস বাই ভ্যালু বা পাস বাই বাই রেফারেন্স


102

আমি সুইফ্টে সত্যিই নতুন এবং আমি কেবল পড়েছি যে ক্লাসগুলি রেফারেন্স দ্বারা পাস করা হয় এবং অ্যারে / স্ট্রিং ইত্যাদি অনুলিপি করা হয়।

রেফারেন্সের মাধ্যমে পাসটি কি একইভাবে অবজেক্টিভ-সি বা জাভা যেখানে আপনি "" একটি "রেফারেন্সটি পাস করেন বা রেফারেন্স দ্বারা এটি সঠিক পাস?


"উদ্দেশ্য-সি বা জাভা হিসাবে একইভাবে রেফারেন্স দ্বারা পাস" না উদ্দেশ্য বা সি বা জাভা পাস-বাই-রেফারেন্স নেই।
newacct

4
হ্যাঁ. আমি জানি। আপনি রেফারেন্স দিয়ে পাস করবেন না। আপনি মান দ্বারা রেফারেন্স পাস। আমি ধরে নিয়েছিলাম যে উত্তর দেওয়ার সময় এটি জানা ছিল।
Gran_profaci

জাভা মান দ্বারা পাস, রেফারেন্স নয়।
6rchid

উত্তর:


169

সুইফটে জিনিসের প্রকার

বিধিটি হ'ল:

  • শ্রেণীর উদাহরণগুলি রেফারেন্সের ধরণ (যেমন শ্রেণীর উদাহরণগুলির জন্য আপনার রেফারেন্স কার্যকরভাবে পয়েন্টার হয় )

  • ফাংশনগুলি রেফারেন্সের ধরণ

  • অন্য সব কিছুই একটি মূল্য প্রকার ; "অন্য সব কিছু" এর অর্থ সহজভাবে স্ট্রিমগুলির উদাহরণ এবং এনামগুলির উদাহরণস্বরূপ, কারণ সুইফটে এটিই রয়েছে। অ্যারে এবং স্ট্রিংগুলি উদাহরণস্বরূপ struct আপনি যেমন নতুন্যাক্টটি নির্দেশ করেছেন ঠিক তেমন ব্যবহার করে এবং ঠিকানার মাধ্যমে এই জিনিসগুলির মধ্যে একটি (ফাংশন আর্গুমেন্ট হিসাবে) একটি রেফারেন্স পাস করতে পারেনinout । তবে টাইপটি নিজেই একটি মান ধরণের।

আপনার জন্য রেফারেন্সের ধরণগুলি কী বোঝায়

একটি রেফারেন্স টাইপ অবজেক্টটি অনুশীলনে বিশেষ কারণ:

  • আমার কাছে অ্যাসাইনমেন্ট বা ফাংশনে উত্তীর্ণ হওয়ার ফলে একই বস্তুর একাধিক উল্লেখ পাওয়া যায়

  • রেফারেন্সটি যদি একটি ধ্রুবক letহয় ( এমনকি স্পষ্ট করে বা বোঝানো হয়) এমনকি অবজেক্টটি নিজেই পরিবর্তনযোগ্য ।

  • অবজেক্টের কোনও রূপান্তর object অবজেক্টটিকে তার সমস্ত রেফারেন্স দ্বারা দেখা হিসাবে প্রভাবিত করে।

এগুলি বিপদ হতে পারে, তাই নজর রাখুন। অন্যদিকে, একটি রেফারেন্স টাইপ পাস করা পরিষ্কারভাবে দক্ষ কারণ কেবলমাত্র একটি পয়েন্টার অনুলিপি করে পাস করা হয় যা তুচ্ছ।

আপনার জন্য মূল্য মূল্য কী বোঝায়

স্পষ্টতই, কোনও মান ধরণের পাস করা "নিরাপদ" এবং এর letঅর্থ যা বোঝায়: আপনি কোনও কাঠামোর উদাহরণটি পরিবর্তন করতে পারবেন না বা কোনও letরেফারেন্সের মাধ্যমে উদাহরণস্বরূপ এনাম ইনস্ট্যান্স করতে পারবেন না । অন্যদিকে, মানটির পৃথক অনুলিপি তৈরি করে সেই সুরক্ষা পাওয়া যায়, তাই না? এটি কি কোনও ধরণের মান ধরণের সম্ভাব্য ব্যয় করে না?

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


6
"শ্রেণীর উদাহরণগুলি রেফারেন্স দিয়ে পাস হয় Fun ফাংশনগুলি রেফারেন্স দিয়ে পাস হয়" না। এটি প্যারা-বাই-মান হয় যখন প্যারামিটারটি inoutনির্বিশেষে নয় । কিছু পাস-বাই-রেফারেন্স কিনা তা টাইপগুলিতে অরথোগোনাল।
newacct

5
@ নিউভ্যাক্ট ওয়েল, অবশ্যই আপনি কঠোর অর্থে ঠিক বলেছেন! কঠোরভাবে, একজনকে বলা উচিত যে সমস্ত কিছু পাস-বাই-মান হয় তবে এনাম উদাহরণস্বরূপ এবং স্ট্রাক্ট উদাহরণগুলি মান ধরণের এবং শ্রেণীর দৃষ্টান্তগুলি এবং কার্যগুলি রেফারেন্স ধরণের । উদাহরণস্বরূপ, বিকাশকারী.অ্যাপল. com/swift/blog/?id=10 দেখুন - এছাড়াও বিকাশকারী। অ্যাপ্লিকাল / লিবারি / আইওস / ডকুমেন্টেশন / সুইউট / কনসেপ্টুয়াল / দেখুন দেখুন, তবে আমি সাধারণের সাথে যা বলেছি তা আমি মনে করি শব্দ বোধ অর্থ।
ম্যাট

7
সঠিক, এবং মান ধরণের / রেফারেন্সের ধরণগুলি পাস-বাই-ভ্যালু / পাস-বাই-রেফারেন্সের সাথে বিভ্রান্ত হওয়া উচিত নয়, কারণ মান প্রকারগুলি মান দ্বারা বা রেফারেন্স দ্বারা পাস করা যেতে পারে এবং রেফারেন্সের প্রকারগুলি মান বা রেফারেন্সের মাধ্যমেও পাস করা যেতে পারে।
newacct

4
@ স্নাতকের খুব দরকারী আলোচনা; আমি আমার সংক্ষিপ্তসারটি আবার লিখছি যাতে এটি বিভ্রান্ত না হয়।
ম্যাট

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

47

সুইফ্টের সমস্ত কিছুই ডিফল্টরূপে "অনুলিপি" দ্বারা পাস করা হয়, সুতরাং যখন আপনি কোনও মূল্য-প্রকারটি পাস করেন তখন আপনি মানটির একটি অনুলিপি পাবেন এবং আপনি যখন কোনও রেফারেন্স টাইপ পাস করেন তখন সমস্ত উল্লেখের সাথে রেফারেন্সের একটি অনুলিপি পাবেন। (এটি, এখনও রেফারেন্সের অনুলিপিটি মূল রেফারেন্সের মতো একই উদাহরণে নির্দেশ করে))

উপরের "অনুলিপি" এর আশেপাশে আমি ভীতিজনক উক্তি ব্যবহার করি কারণ সুইফ্ট প্রচুর পরিমাণে অপ্টিমাইজেশন করে; যেখানেই সম্ভব, কোনও পরিবর্তন বা রূপান্তর সম্ভাবনা না হওয়া পর্যন্ত এটি অনুলিপি করে না। যেহেতু প্যারামিটারগুলি ডিফল্টরূপে অপরিবর্তনীয়, এর অর্থ হ'ল বেশিরভাগ সময় অনুলিপি আসলে হয় না।


আমার জন্য এটি সর্বোত্তম উত্তর কারণ এটি স্পষ্ট করে জানিয়েছে যে উদাহরণস্বরূপ বৈশিষ্ট্যগুলি ফাংশনের অভ্যন্তরে এমনকি পরামিতি অনুলিপি করা যেতে পারে (মান দ্বারা পাস) কারণ এটি একই রেফারেন্সকে নির্দেশ করে।
MrAn3


45

প্যারামিটারটি না থাকলে এটি সর্বদা পাস-বাই-মান হয় inout

এটা তোলে হয় সবসময় পাস-বাই-রেফারেন্স যদি প্যারামিটার inout। যাইহোক, প্যারামিটারে &যাওয়ার সময় আপনাকে আর্গুমেন্টে স্পষ্টভাবে অপারেটরটি ব্যবহার করার প্রয়োজনটি কিছুটা জটিল inout, সুতরাং এটি পাস-বাই-রেফারেন্সের প্রথাগত সংজ্ঞা অনুসারে ফিট করে না, যেখানে আপনি সরাসরি পরিবর্তনশীলটি পাস করেন।


4
এই উত্তরটি, নেট কুকের সাথে মিলিত হয়ে আমার পক্ষে (সি ++ থেকে আসা) পরিষ্কার ছিল যে এমনকি "রেফারেন্স টাইপ" ফাংশনের ক্ষেত্রের বাইরেও সংশোধন করা যাবে না যদি আপনি স্পষ্টভাবে এটি নির্দিষ্ট করে (ব্যবহার করে inout) নির্দিষ্ট না করেন
Gobe

10
inoutপ্রকৃতপক্ষে রেফারেন্স দ্বারা পাস করা হয় না তবে অনুলিপি-অনুলিপি-কপি-আউট এটি কেবল গ্যারান্টি দেয় যে ফাংশন কলের পরে পরিবর্তিত মানটি মূল আর্গুমেন্টে বরাদ্দ করা হবে। ইন-আউট প্যারামিটারগুলি
ডালিজা প্রসন্নিকার

4
যদিও এটি সত্য যে সমস্ত কিছু মান দ্বারা পাস হয়। একই ধরণের অনুলিপি হিসাবে রেফারেন্সের ধরণের বৈশিষ্ট্যগুলি ফাংশনের অভ্যন্তরে পরিবর্তন করা যেতে পারে।
মিস্টারএএন 3

9

রেফারেন্স দ্বারা পাস করার জন্য এখানে একটি ছোট কোড নমুনা। আপনার কাছে দৃ strong় কারণ না থাকলে এটি করা থেকে বিরত থাকুন।

func ComputeSomeValues(_ value1: inout String, _ value2: inout Int){
    value1 = "my great computation 1";
    value2 = 123456;
}

এটিকে কল করুন

var val1: String = "";
var val2: Int = -1;
ComputeSomeValues(&val1, &val2);

4
কেন আপনি এটি করা এড়ানো উচিত?
বুদ্ধিহীন

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

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

7

অ্যাপল সুইফট ডেভেলপার ব্লগে একটি পোস্ট বলা মূল্য এবং রেফারেন্স প্রকারভেদ যে এই খুব বিষয়ে একটি পরিষ্কার এবং বিস্তারিত আলোচনা প্রদান করে।

উদ্ধৃতি থেকে:

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

সুইফ্ট ব্লগ পোস্টটি উদাহরণগুলির সাথে পার্থক্যগুলি ব্যাখ্যা করে চলেছে এবং পরামর্শ দেয় যে আপনি কখন অন্যটির ব্যবহার করবেন।


4
এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি পাস-বাই-মান বনাম পাস-বাই রেফারেন্স সম্পর্কিত যা রেফারেন্স প্রকারের মান ধরণের সম্পূর্ণরূপে অর্থেগোনাল।
Jörg ডব্লু মিটাগ

2

ক্লাসগুলি রেফারেন্স দ্বারা পাস হয় এবং অন্যেরা ডিফল্টরূপে মান দ্বারা পাস হয়। আপনি inoutকীওয়ার্ডটি ব্যবহার করে রেফারেন্স দিয়ে পাস করতে পারেন ।


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

2

আপনি যখন ইনফিক্স অপারেটরের যেমন ইন = আউটআউট ব্যবহার করেন তখন + ঠিকানা চিহ্নটিকে উপেক্ষা করা যায়। আমার অনুমান সংকলক রেফারেন্স দিয়ে পাস অনুমান করে?

extension Dictionary {
    static func += (left: inout Dictionary, right: Dictionary) {
        for (key, value) in right {
            left[key] = value
        }
    }
}

অরিজিনডিয়েশনারি + = নতুনডেটরিও টোঅ্যাড

এবং দুর্দান্তভাবে এই অভিধানটি 'যুক্ত' কেবল একটির কাছে মূল রেফারেন্সে লিখতে পারে, লক করার জন্য এত দুর্দান্ত!


2

ক্লাস এবং স্ট্রাকচার

স্ট্রাকচার এবং ক্লাসগুলির মধ্যে অন্যতম গুরুত্বপূর্ণ পার্থক্য হ'ল স্ট্রাকচারগুলি সর্বদা অনুলিপি করা হয় যখন সেগুলি আপনার কোডের চারপাশে পাস করা হয় তবে ক্লাসগুলি রেফারেন্স দ্বারা পাস হয়।

বন্ধ

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

এআরসি (স্বয়ংক্রিয় রেফারেন্স গণনা)

রেফারেন্স গণনা শুধুমাত্র ক্লাসের উদাহরণগুলিতে প্রযোজ্য। কাঠামো এবং গণনাগুলি মান ধরণের, রেফারেন্সের ধরণের নয়, এবং সংরক্ষণ করা হয় না এবং রেফারেন্সের মাধ্যমে পাস হয় না।

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