দ্রুত ভাষাতে কাঠামো বনাম শ্রেণি


192

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

কেউ কি আমাকে বুঝতে সাহায্য করতে পারে তার অর্থ? আমার কাছে, ক্লাস এবং স্ট্রাক্টগুলি একই বলে মনে হচ্ছে।


3
নেট: স্ট্যাকওভারফ্লো. com/ a / 13275 / 19100 এ কাঠামো এবং শ্রেণীর মধ্যে পার্থক্য দেখুন , আমি অনুমান করছি যে সুইফট একই শব্দার্থক শব্দ ব্যবহার করে use
ডালে

23
@ জোনারশপে আপনার পক্ষে সহজ হতে পারে? আপনি যদি উত্তরটি জানেন তবে আপনি কি আমাকে উত্তর দিতে পারেন
মণীশ অগ্রওয়াল

1
মান বনাম রেফারেন্স কোনও ওওপি ধারণা নয়। এটি সি-তে রয়েছে, void my_func(int a)বনামের মতো void my_func(int &a)। এটি প্রোগ্রামিংয়ের একটি খুব মৌলিক প্রশ্ন। বিস্তারিত পড়ুন: stackoverflow.com/questions/373419/...
superarts.org

উত্তর:


473

এখানে একটি সঙ্গে একটি উদাহরণ class। নাম পরিবর্তন করা হয় কীভাবে নোট করুন, উভয় ভেরিয়েবল দ্বারা উল্লিখিত উদাহরণটি আপডেট করা হবে। Bobএখন Sue, সর্বত্র যেখানে Bobকখনও উল্লেখ করা হয়েছিল।

class SomeClass {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var aClass = SomeClass(name: "Bob")
var bClass = aClass // aClass and bClass now reference the same instance!
bClass.name = "Sue"

println(aClass.name) // "Sue"
println(bClass.name) // "Sue"

এবং এখন একটি দিয়ে structআমরা দেখতে পাচ্ছি যে মানগুলি অনুলিপি করা হয়েছে এবং প্রতিটি ভেরিয়েবল তার নিজস্ব মানগুলির সেট রাখে। যখন আমরা নামটি সেট করি Sue, তখন Bobস্ট্রাক্ট aStructপরিবর্তন হয় না।

struct SomeStruct {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var aStruct = SomeStruct(name: "Bob")
var bStruct = aStruct // aStruct and bStruct are two structs with the same value!
bStruct.name = "Sue"

println(aStruct.name) // "Bob"
println(bStruct.name) // "Sue"

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


"কিন্তু মান যে তাদের জন্য কোন কেবল একটি সংখ্যার চেয়ে আরো জটিল ..." এই অ্যালেক্স জন্য ধন্যবাদ
মাইক Rapadas

7
@ মিশেলরাপাদাস নাম্বারগুলি আসলে সুইফটে স্ট্রোকস ।
নিকোলাই রুহে

aStruct and bStruct are two structs with the same value!স্ট্রাক্টের ভিতরে ভেরিয়েবলের মান আলাদা হওয়ায় আপনি কি আমাকে এটি পরিষ্কার করতে পারেন।
জুলিয়ান ক্রোল

@ জুলিয়ানক্রোল এ লাইন aStructএবং bStructঅভিন্ন মান রয়েছে। তাদের উভয়ের একটি একক nameক্ষেত্র যা সেট করা আছে "Bob"। তবে সেগুলি দুটি পৃথক স্ট্রাক্ট। এটি পরবর্তী লাইনে প্রমাণিত হয় যখন আপনি কোনও স্ট্রকের নাম পরিবর্তন করতে পারেন এবং অন্যটি অপরিবর্তিত থাকে।
অ্যালেক্স ওয়েন

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

60

শ্রেণী এবং কাঠামো উভয়ই করতে পারে:

  • মান সংরক্ষণ করার জন্য বৈশিষ্ট্যগুলি সংজ্ঞায়িত করুন
  • কার্যকারিতা সরবরাহ করার জন্য পদ্ধতিগুলি সংজ্ঞায়িত করুন
  • প্রসারিত হতে হবে
  • প্রোটোকল অনুসারে
  • অন্তর্নিহিতদের সংজ্ঞায়িত করুন
  • সাবস্ক্রিপ্টগুলি তাদের ভেরিয়েবলগুলিতে অ্যাক্সেস সরবরাহ করতে সংজ্ঞায়িত করুন

কেবল ক্লাসই করতে পারে:

  • উত্তরাধিকার
  • Castালাই টাইপ করুন
  • ডিনিটালাইজারগুলি সংজ্ঞায়িত করুন
  • একাধিক উল্লেখের জন্য রেফারেন্স গণনা মঞ্জুরি দিন ow

32

structমান মান হয়। এর অর্থ হ'ল যদি আপনি কাঠামোর উদাহরণটি অন্য ভেরিয়েবলে অনুলিপি করেন তবে এটি কেবল ভেরিয়েবলটিতে অনুলিপি করা হয়।

মান ধরণের জন্য উদাহরণ

struct Resolution {
    var width = 2
    var height = 3
}

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd //assigning struct instance  to variable
println("Width of cinema instance is \(cinema.width)")//result is 1920
println("Width of hd instance is \(hd.width)")//result is 1920

cinema.width = 2048

println("Width of cinema instance is \(cinema.width)")//result is 2048
println("Width of hd instance is \(hd.width)")//result is 1920

ক্লাসগুলি রেফারেন্সের ধরণ। এর অর্থ হ'ল আপনি যদি ক্লাসের কোনও উদাহরণ কোনও ভেরিয়েবলকে অর্পণ করেন তবে এটি কেবল উদাহরণটির রেফারেন্স রাখবে এবং অনুলিপিটি নয়


5
"যদি আপনি ক্লাসের কোনও উদাহরণ অন্য ভেরিয়েবলের কাছে অর্পণ করেন তবে এটি অনুলিপি না করে কেবল উদাহরণটির রেফারেন্স ধারণ করবে।"
সাইফ

8

উপরের উত্তরগুলি সঠিক আছে আমি আশা করি আমার উত্তরটি এমন কাউকে সহায়তা করবে যা উপরের উত্তরগুলি বুঝতে পারে না।

ওয়েল সুইফটে দুটি ধরণের অবজেক্ট রয়েছে

  1. struct
  2. শ্রেণী

তাদের মধ্যে প্রধান পার্থক্য

  • স্ট্রাক্ট মান টাইপ
  • ক্লাস হল রেফারেন্স টাইপ

উদাহরণস্বরূপ এখানে কোডটি ভালভাবে বোঝার জন্য।

struct SomeStruct {
var a : Int;

init(_ a : Int) {
    self.a = a
}
}

class SomeClass {
var a: Int;

init(_ a: Int) {
    self.a = a
}

}
var x = 11

var someStruct1 = SomeStruct(x)
var someClass1 = SomeClass(x)

var someStruct2 = someStruct1
var someClass2 = someClass1

someClass1.a = 12
someClass2.a // answer is 12 because it is referencing to class 1     property a

someStruct1.a = 14
someStruct2.a // answer is 11 because it is just copying it not referencing it

এটি মূল পার্থক্য ছিল তবে আমাদের মধ্যে সাব-পার্থক্যও রয়েছে।

শ্রেণী

  1. প্রারম্ভিক (নির্মাণকারী) ঘোষণা করতে হবে
  2. ডিনিটালাইজার রয়েছে Has
  3. অন্যান্য ক্লাস থেকে উত্তরাধিকারী হতে পারে

struct

  1. এটি আপনার জন্য নিখরচায় ইনিশিয়ালাইজার রয়েছে, আপনি যদি ফ্রি ইনিশিয়ালাইজারটি আপনার ঘোষিত ইনিশিয়ালাইজার দ্বারা ওভাররাইট করা হয় তবে আপনাকে ইনিটালাইজার ঘোষণা করতে হবে না
  2. ডিনিটালাইজার নেই
  3. অন্যান্য কাঠামো থেকে উত্তরাধিকারী হতে পারে না

7

এই প্রশ্নটি সদৃশ বলে মনে হচ্ছে তবে নির্বিশেষে, নিম্নলিখিত ব্যবহারের সর্বাধিক উত্তর দেবে:

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

  2. এছাড়াও, ক্লাসগুলির উত্তরাধিকার থাকে যা এক শ্রেণিকে অন্যের বৈশিষ্ট্যগুলির উত্তরাধিকারী হতে দেয়।

  3. স্ট্রাক্ট বৈশিষ্ট্যগুলি স্ট্যাকের উপর সংরক্ষণ করা হয় এবং শ্রেণি উদাহরণগুলি হিপে সংরক্ষণ করা হয়, কখনও কখনও স্ট্যাকটি একটি শ্রেণীর চেয়ে মারাত্মকভাবে দ্রুত হয়।

  4. স্ট্রাক্ট স্বয়ংক্রিয়ভাবে ডিফল্ট ইনিশিয়ালাইজার পায় যেখানে ক্লাসে, আমাদের আরম্ভ করতে হয়।

  5. স্ট্রাক্ট যে কোনও সময় থ্রেড সেফ বা সিঙ্গলটন।

এবং এছাড়াও, স্ট্রাক্ট এবং ক্লাসগুলির মধ্যে পার্থক্যটির সংক্ষিপ্তসার জন্য, মান এবং রেফারেন্স ধরণের মধ্যে পার্থক্যটি বোঝা প্রয়োজন।

  1. আপনি যখন কোনও মান ধরণের একটি অনুলিপি তৈরি করেন, এটি আপনাকে নতুন ভেরিয়েবলে অনুলিপি করা জিনিসটি থেকে সমস্ত ডেটা অনুলিপি করে। এগুলি 2 পৃথক জিনিস এবং একটি পরিবর্তন অন্যটির উপর প্রভাব ফেলবে না।
  2. আপনি যখন কোনও রেফারেন্স টাইপের একটি অনুলিপি তৈরি করেন, তখন নতুন ভেরিয়েবলটি আপনি যে অনুলিপি করছেন সেই একই মেমরির অবস্থানটিকে বোঝায়। এর অর্থ হ'ল একটি পরিবর্তন করা অন্যটির পরিবর্তিত হবে কারণ তারা উভয়ই একই মেমরির অবস্থান উল্লেখ করে। নীচের নমুনা কোড রেফারেন্স হিসাবে নেওয়া যেতে পারে।

// স্যাম্পলপ্লেগ্রাউন্ড.প্লেগ্রাউন্ড

  class MyClass {
        var myName: String
        init(myName: String){
            self.myName = myName;
        }
    }

    var myClassExistingName = MyClass(myName: "DILIP")
    var myClassNewName = myClassExistingName
    myClassNewName.myName = "John"


    print("Current Name: ",myClassExistingName.myName)
    print("Modified Name", myClassNewName.myName)

    print("*************************")

    struct myStruct {
        var programmeType: String
        init(programmeType: String){
            self.programmeType = programmeType
        }
    }

    var myStructExistingValue = myStruct(programmeType: "Animation")
    var myStructNewValue = myStructExistingValue
    myStructNewValue.programmeType = "Thriller"

    print("myStructExistingValue: ", myStructExistingValue.programmeType)
    print("myStructNewValue: ", myStructNewValue.programmeType)

আউটপুট:

Current Name:  John
Modified Name John
*************************
myStructExistingValue:  Animation
myStructNewValue:  Thriller

হাই দিলীপ, আপনি কি "যে কোনও সময় থ্রেডটি থ্রেড সেফ বা সিঙ্গলটন" এর উদাহরণ দিতে পারেন? "?. আগাম ধন্যবাদ.
নরসিংহ নল্লামেস্টে

3

আপনি যদি অ্যাপল হ্যান্ডবুকে আরও দূরে সন্ধান করেন তবে আপনি এই বিভাগটি দেখতে পাবেন: "কাঠামো এবং গণনাগুলি মূল্য প্রকারের"

এই বিভাগে আপনি এটি দেখতে পাবেন:

“লে এইচডি = রেজোলিউশন (প্রস্থ: 1920, উচ্চতা: 1080) বর্ণ সিনেমা = এইচডি এই উদাহরণটি একটি ধ্রুবক হিসাবে পরিচিত এইচডি ঘোষণা করে এবং এটি একটি রেজোলিউশনে সেট করে উদাহরণটি পূর্ণ এইচডি ভিডিওর প্রস্থ এবং উচ্চতার (1920 পিক্সেল প্রশস্ত 1080 পিক্সেল উচ্চ) দিয়ে শুরু করা হয়েছে।

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

এরপরে, সিনেমার প্রস্থের সম্পত্তিটি ডিজিটাল সিনেমা প্রক্ষেপণের জন্য ব্যবহৃত সামান্য প্রশস্ত 2 কে মানের প্রস্থে সংশোধন করা হয় (2048 পিক্সেল প্রশস্ত এবং 1080 পিক্সেল উচ্চ):

সিনেমা প্রস্থ = 2048 সিনেমার প্রস্থের সম্পত্তিটি পরীক্ষা করা দেখায় যে এটি সত্যই পরিবর্তিত হয়েছে 2048:

Println ("সিনেমা এখন (সিনেমা। প্রস্থ) প্রশস্ত পিক্সেল") // প্রিন্টস "সিনেমা এখন 2048 পিক্সেল প্রশস্ত তবে মূল এইচডি উদাহরণের প্রস্থের সম্পত্তিটি এখনও পুরানো আছে 1920 এর মূল্য:

println ("এইচডি এখনও (এইচডি প্রস্থ) পিক্সেল প্রশস্ত") // প্রিন্টস "এইচডি এখনও 1920 পিক্সেল প্রশস্ত"

যখন সিনেমাটিকে এইচডি-র বর্তমান মান দেওয়া হয়, তখন এইচডি-তে সঞ্চিত মানগুলি নতুন সিনেমা দৃষ্টান্তে অনুলিপি করা হয়। শেষ ফলাফলটি দুটি সম্পূর্ণ পৃথক দৃষ্টান্ত, যা কেবল একই সংখ্যাসূচক মানগুলিকে ধারণ করে। কারণ এগুলি পৃথক উদাহরণ, সিনেমার প্রস্থকে 2048 এ সেট করা এইচডি মধ্যে সঞ্চিত প্রস্থকে প্রভাবিত করে না। "

এর উত্স: অ্যাপল ইনক। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা।" iBooks। https://itun.es/us/jEUH0.l

এটি স্ট্রাক্ট এবং ক্লাসগুলির মধ্যে সবচেয়ে বড় পার্থক্য। স্ট্রাক্টগুলি অনুলিপি করা হয় এবং ক্লাসগুলি রেফারেন্স করা হয়।


1

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

স্ট্রিং এবং অ্যারে অবজেক্ট দিয়ে এমনকি পারফরম্যান্স উন্নত করতে সুইফট স্ট্রাক্ট ব্যবহার করে।

সত্যিই এখানে ভাল পড়া


1

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

কোন শ্রেণির সাথে আসুন শুরু, Equatable এই বর্গ কে কনর্ফাম করে মাত্র দৃষ্টান্ত তুলনা পাবে, আমরা একটি দৃষ্টান্ত নামক তৈরি pointClassInstanceAএবং অন্যান্য নামক pointClassInstanceBবর্গ বি আমরা বরাদ্দ বর্গ, এখন কথন বলছেন যে তারা একই ...

class PointClass: Equatable {
    var x: Double
    var y: Double

    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }

    static func == (lhs: PointClass, rhs: PointClass) -> Bool {
        return lhs.x == rhs.x && lhs.y == rhs.y
    }
}

var pointClassInstanceA = PointClass(x: 0, y: 0)
var pointClassInstanceB = pointClassInstanceA

assert(pointClassInstanceA==pointClassInstanceB) 

pointClassInstanceB.x = 10
print(pointClassInstanceA.x)
//this prints 10

ঠিক আছে, এখানে কী ঘটেছিল কেন আমরা যদি মাত্র পয়েন্টস ক্লাসআইন্সট্যান্সবি এর x মান পরিবর্তন করেছি তবে এটি পয়েন্টক্লাসআইন্সট্যান্সএর এক্স মানও পরিবর্তন করেছে? ঠিক আছে, এটি রেফারেন্সের ধরণগুলি কীভাবে কাজ করে তা দেখায়, যখন আমরা উদাহরণ এটিকে উদাহরণ বি এর মান হিসাবে নির্ধারিত করি এবং তারপরে আমরা এর মধ্যে একটিতে এক্স পরিবর্তন করি তবে এটি উভয়ের এক্স এর পরিবর্তিত হবে কারণ তারা একই রেফারেন্স ভাগ করে এবং কী পরিবর্তিত হয়েছিল সেটির মান ছিল রেফারেন্স।

আসুন একই কাজ কিন্তু একটি স্ট্রাক্ট সঙ্গে

struct PointStruct: Equatable {
    var x: Double
    var y: Double

    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }

    static func == (lhs: PointStruct, rhs: PointStruct) -> Bool {
        return lhs.x == rhs.x && lhs.y == rhs.y
    }
}
var pointStructInstanceA = PointStruct(x: 0, y: 0)
var pointStructInstanceB = pointStructInstanceA

assert(pointStructInstanceA==pointStructInstanceB)
pointStructInstanceB.x = 100
print(pointStructInstanceA.x)
//this will print 0

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

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


1

এখানে একটি উদাহরণ যা স্ট্রাক্ট এবং শ্রেণীর মধ্যে পার্থক্যটি নিখুঁতভাবে দেখায়।

খেলার মাঠে লিখিত কোডের স্ক্রিনশট
খেলার মাঠে লিখিত কোডের স্ক্রিনশট

struct Radio1{
    var name:String
    //    init(name:String) {
    //        self.name = name
    //    }
}

struct Car1{
    var radio:Radio1?
    var model:String

}

var i1 = Car1(radio: Radio1(name:"murphy"),model:"sedan")
var i2 = i1
//since car instance i1 is a struct and 
//this car has every member as struct ,
//all values are copied into i2

i2.radio?.name //murphy
i2.radio = Radio1(name: "alpha")
i2.radio?.name //alpha

i1.radio?.name //murphy

//since Radio1 was struct , 
//values were copied and thus
// changing name  of instance of Radio1 in i2 
//did not bring change in i1

class Radio2{
    var name:String
    init(name:String) {
        self.name = name
    }
}

struct Car2{
    var radio:Radio2?
    var model:String

}
var i3 = Car2(radio: Radio2(name:"murphy"),model:"sedan")
//var radioInstance = Radio2(name: "murphy")
//var i3 = Car2(radio: radioInstance,model:"sedan")

var i4 = i3
//since i3 is instance of struct
//everything is copied to i4 including reference of instance of Radio2
//because Radio2 is a class



i4.radio?.name //murphy
i4.radio?.name="alpha"
i4.radio?.name //alpha

i3.radio?.name //alpha

//since Radio2 was class, 
//reference was copied and 
//thus changing name of instance 
//of Radio2 in i4 did  bring change in i3 too


//i4.radio?.name
//i4.radio = Radio2(name: "alpha")
//i4.radio?.name
//
//i3.radio?.name

1
1.structure is value type.
   = > when we assign structure variable to other variable or pass as parameter to function, it creates separate/new copy => so that changes made on one variable does not  reflect on another.[We can say like **call by value** concept] 
Example :

    struct DemoStruct 
    { 
        var value: String 
        init(inValue: String) 
        { 
            self.value = inValue 
        } 
    } 


var aStruct = DemoStruct(inValue: "original") 
var bStruct = aStruct // aStruct and bStruct are two structs with the same value! but references to diff location`enter code here`
bStruct.value = "modified" 

print(aStruct.value) // "original" 
print(bStruct.value) // "modified"


2.class is reference type.
 = > when we assign structure variable to other variable or pass as parameter to function, it **does not** creates separate/new copy => so that changes made on one variable does not  reflect on another.[We can say like **call by reference** concept] 
Example:
class DemoClass 
{   
    var value: String 
    init(inValue: String) 
    {
        self.value = inValue 
    } 
} 

var aClass = DemoClass(inName: "original") 
var bClass = aClass // aClass and bClass now reference the same instance! 
bClass.value = "modified" 

print(aClass.value) // "modified" 
print(bClass.value) // "modified"

1

সুইফট প্রকারের

Value type একটি প্রকার যা এর মান অনুলিপি করা হয় যখন এটি পরিবর্তনশীল বা ধ্রুবককে অর্পণ করা হয়, বা যখন এটি কোনও কার্যক্রমে পাস হয়

Reference types যখন তারা কোনও পরিবর্তনশীল বা ধ্রুবককে অর্পণ করা হয় বা কোনও ফাংশনে পাস করা হয় তখন তাদের অনুলিপি করা হয় না

মূল্য প্রকার :
Struct, Enum, Tuple
struct String, struct Array( Set, Dictionary)

  • আপনি নিয়োগ বা পাস করার সময় ডেটা value typeএকটি নতুন অনুলিপি তৈরি করা হয়। আসলে copy on write- COWকিছু অপটিমাইজেশন সহ মেকানিজম ব্যবহৃত হয়, উদাহরণস্বরূপ অনুলিপিটি যখন বস্তুটি সংশোধন করা হয় তখন তৈরি করা হয়
  • আপনি যখন কোনও দৃষ্টান্ত পরিবর্তন করেন এটির কেবল স্থানীয় প্রভাব থাকে।
  • স্ট্যাক মেমরি ব্যবহার করা হয়।

রেফারেন্স প্রকার :
Class,Function

  • আপনি যখন অর্পণ করবেন বা পাস করুন মূল উদাহরণটির জন্য reference typeএকটি নতুন রেফারেন্স তৈরি হবে (উদাহরণের ঠিকানাটি অনুলিপি করা হবে)।
  • আপনি যখন কোনও উদাহরণটি সংশোধন করেন এটির একটি বৈশ্বিক প্রভাব রয়েছে কারণ উদাহরণটি ভাগ করা এবং এতে উল্লেখ করা কোনও রেফারেন্স দ্বারা অ্যাক্সেসযোগ্য।
  • গাদা মেমরি ব্যবহার করা হয়।

এখানে চিত্র বর্ণনা লিখুন

Value typeডিফল্টরূপে ব্যবহার করার পরামর্শ দেওয়া হয় । এর সবচেয়ে বড় সুবিধাটি Value typeহ'ল সাধারণত তারাthread safe

Reference type পেশাদাররা:

  • তারা উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে,
  • deinit() ব্যবহার করা যেতে পারে,
  • উদাহরণগুলির সাথে রেফারেন্সের সাথে তুলনা করুন ===,
  • Objective-Cআন্তঃক্রিয়াশীলতা কারণ সুইফটে Value Typeচালু হয়েছিল।

[আরো জানুন পরিবর্তনশীলতা]
কাঠামো এবং শ্রেণীর মধ্যে নির্বাচন
প্রকারভেদ
ক্লাস এবং কাঠামো


0

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

মনে করুন আপনি আপনার বন্ধুর সাথে একটি গুগল ডক শিট ভাগ করছেন। এখন তিনি যদি এতে কিছু পরিবর্তন করেন তবে আপনি এটিও দেখতে পাবেন যে আপনার গুগল ডক-এর পরিবর্তনগুলি, এর অর্থ আপনার অনুলিপিও প্রভাবিত হয়েছে। এটি মূলত " রেফারেন্স দ্বারা পাস "।

তবে ধরুন, আপনি যদি আপনার মেশিনে একটি .XLS fie সঞ্চয় করে থাকেন। আপনি সেই ফাইলটি আপনার বন্ধুকে প্রদান করুন। এখন যদি সে সেই ফাইলটিতে কোনও পরিবর্তন করে চলেছে তবে আপনার ফাইলটি বিশৃঙ্খলা / প্রভাবিত হবে না কারণ আপনার নিজের অনুলিপি রয়েছে। এটি মূলত " মান দ্বারা পাস "। দ্রুত খেলার মাঠে এই সাদৃশ্যটি পরীক্ষা করতে আপনার কাছে ইতিমধ্যে একাধিক সাধারণ প্রোগ্রাম রয়েছে।

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