সুইফটে 'গেট' এবং 'সেট' কী কী?


106

আমি সুইফট শিখছি এবং আমি The Swift Programming Languageঅ্যাপল থেকে পড়ছি , আমার কোনও উদ্দেশ্য সি ব্যাকগ্রাউন্ড নেই (কেবল পিএইচপি, জেএস, এবং অন্যান্য তবে কোনও ওজে সি নেই)

24-25 পৃষ্ঠায় আমি এই কোডটি দেখতে পাচ্ছি:

//...Class definition stuff...

var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

//...Class continues...

এই অংশটি বইটিতে নির্দিষ্ট করা হয়নি এবং সেগুলির জন্য যা পাচ্ছি তা আমি পাচ্ছি না।

কেউ কি আমাকে ব্যাখ্যা করতে পারবেন কি পেতে এবং সেট কি?


4
আপনি গেটর / সেটার সম্পর্কে পিগ 21 পড়েছেন? এছাড়াও, প্রথম 30 পৃষ্ঠাগুলি বা তারপরে হ'ল সম্পূর্ণ ডকুমেন্টেশন নয় সুইফট সফর
ভোলআরন

আপনি যদি সি ++ করে থাকেন তবে ক্লাসের
গেটর

উত্তর:


41

এটি কোডের ঠিক আগে ব্যাখ্যা করা হয়েছে:

সঞ্চিত সাধারণ বৈশিষ্ট্যগুলি ছাড়াও, বৈশিষ্ট্যে একটি গিটার এবং একটি সেটার থাকতে পারে।

class EquilateralTriangle: NamedShape {
    ...

যখন অন্য কোনও শ্রেণি সেই ঘেরের পরিবর্তনশীল পেতে চায়, তারা এটি করে:

let someVar = myTriangle.perimeter

... যা এটিকে বলে:

get{
    return 3.0 * self.sideLength
}

এবং এইভাবে এটি কলিং কন্ট্রোলার যদি এটি করে তবে এটি মূলত:

let someVar = 3.0 * myTriangle.sideLength

আপনি যখন অন্য কোনও অবজেক্ট থেকে ভেরিয়েবল সেট করেন, তখন এটির মতো দেখাচ্ছে:

myTriangle.perimeter = 100

যা set{}ব্লকে কোডটি আহ্বান করে :

set {
    sideLength = newValue / 3.0
}

এবং তাই এটির মতো এটি হয় যে শ্রেণিটি ভেরিয়েবল নির্ধারণ করে এটি করত:

myTriangle.sideLength = 100/3.0

এটি সত্যই কেবল সুবিধার জন্য - আপনি এই কোডটি অন্য কোড থেকে কল করতে পারেন বা পুরো সময় 3 দিয়ে বিভক্ত না করে বা গুণিত করতে পারেন কারণ ভেরিয়েবলটি পাওয়ার আগে ঠিক এটি ভেরিয়েবল সেট করার আগে এবং ডান হয়ে গেছে।

সুইফটে, আমাদের এমন বৈশিষ্ট্য থাকতে পারে যা অর্জনের সময় গণনা করা হয় এবং সেট করার সময় কিছু করতে পারে। আমরা এটি উদ্দেশ্য-সি-তেও করতে পারি:

// .h
@property (nonatomic) double perimeter;

//.m

- (double)perimeter
{
    return self.sideLength * 3.0;
}
- (void)setPerimeter:(double)perimeter
{
    self.perimeter = perimeter; // In Swift, this is done automatically.
    self.sideLength = perimeter / 3.0;
}

109

ক্লাসের মধ্যে ভেরিয়েবলগুলি পাওয়া এবং সেটিং বলতে হয় তাদের সামগ্রীগুলি পুনরুদ্ধার ("পেয়ে") বা পরিবর্তন ("সেটিং") বোঝায়।

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

সুতরাং আপনি সম্ভবত membersভেরিয়েবল সংজ্ঞা দিয়ে এগিয়ে যেতে হবে :

class family {
   var members:Int
}

এটি, তবে এই শ্রেণিটি ব্যবহার করে লোকদের পরিবারের সদস্য সংখ্যা 0 বা 1 এর মতো নির্দিষ্ট করার সম্ভাবনা দেবে এবং যেহেতু 1 বা 0 পরিবারের মতো কোনও জিনিস নেই তাই এটি যথেষ্ট দুর্ভাগ্যজনক।

এই স্থানে গ্রাহকরা এবং সেটটাররা আসেন This এইভাবে আপনি নিজেই সিদ্ধান্ত নিতে পারেন কীভাবে পরিবর্তনশীলগুলি পরিবর্তন করা যায় এবং তারা কী মান অর্জন করতে পারে এবং সেই সাথে তারা কী কী সামগ্রী ফিরে আসবে তা সিদ্ধান্ত নিতে পারে।

আমাদের পারিবারিক ক্লাসে ফিরে, আসুন নিশ্চিত হয়ে নিন যে কেউ members2 এর চেয়ে কম কিছুতে মান সেট করতে পারে না:

class family {
  var _members:Int = 2
  var members:Int {
   get {
     return _members
   }
   set (newVal) {
     if newVal >= 2 {
       _members = newVal
     } else {
       println('error: cannot have family with less than 2 members')
     }
   }
  }
}

এখন আমরা প্রবেশ করতে পারবেন membersটাইপ করে, আগে যেমন পরিবর্তনশীল instanceOfFamily.members, এবং ধন্যবাদ সেটার ফাংশন, আমরা এটা মান আগের মতই, টাইপ দ্বারা, উদাহরণস্বরূপ সেট করতে পারেন: instanceOfFamily.members = 3। যাইহোক, যা পরিবর্তিত হয়েছে তা হ'ল আমরা এই পরিবর্তনশীলটিকে আর 2 এর চেয়ে ছোট কিছুতে সেট করতে পারি না।

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


members==> count, numberOfMembers; var members : Set<Person>??
GoZoner

4
set (newVal) { ... }, নতুনওয়াল অন্তর্নিহিত, তাই set { _members = newVal }সঠিক।
অ্যান্ড্রেসহাসিং

4
নোট করুন যে ভেরিয়েবলগুলি _membersব্যক্তিগত হওয়া উচিত, অন্যথায় কমান্ডটি 2 এর নীচে একটি মান instanceOfFamily._members=1সেট instanceOfFamily.membersকরে
ড্যানিয়েল

দেখে মনে হচ্ছে ডিফল্ট প্যারামিটারটির নাম newValueসুইফট 4 -র
নোলান অ্যামি

21

একটি সাধারণ প্রশ্ন একটি সংক্ষিপ্ত, সহজ এবং সুস্পষ্ট উত্তর অনুসরণ করা উচিত।

  • আমরা যখন সম্পত্তিটির একটি মূল্য পাচ্ছি তখন এটি তার get{}অংশটিকে আগুন ধরিয়ে দেয় ।

  • আমরা যখন কোনও সম্পত্তির জন্য কোনও মান নির্ধারণ করি তখন এটি তার set{}অংশটিকে আগুন ধরিয়ে দেয় ।

পুনশ্চ. সম্পত্তিতে কোনও মান সেট করার সময়, সুইট স্বয়ংক্রিয়ভাবে "নিউভ্যালু" = একটি মান নির্ধারণ করে যা একটি স্থিতি তৈরি করে। অবিচ্ছিন্ন "নিউভ্যালু" পরে সম্পত্তিটির set{}অংশে অ্যাক্সেসযোগ্য হয় ।

উদাহরণ:

var A:Int = 0
var B:Int = 0

var C:Int {
get {return 1}
set {print("Recived new value", newValue, " and stored into 'B' ")
     B = newValue
     }
}

//When we are getting a value of C it fires get{} part of C property
A = C 
A            //Now A = 1

//When we are setting a value to C it fires set{} part of C property
C = 2
B            //Now B = 2

4
শ্রেণীর বাইরে থেকে সদস্যের অ্যাক্সেসের জন্য ডিফল্ট মান নির্ধারণ করা কি বাধ্যতামূলক? আমি যখন এই সমস্যাটির জন্য ডিফল্ট মান নির্ধারণ করি তখন এই সমস্যাটি স্থির হিসাবে ইউজারবিয়ান: এনএসবজেক্ট {ভেরো ইউজার_আইডি: স্ট্রিং? = শূন্য it নিম্নলিখিত ব্যবহারকারীর মতো এটিকে অ্যাক্সেস করা যাক: ইউজারবিয়ান = ইউজারবিয়ান () ইউজার.উসার_আইডি = "23232332"
আমর রাগান্বিত

2

আপনার গুণিত গুণাবলীর দিকে নজর দেওয়া উচিত

আপনার কোডের নমুনায় perimeterকোনও শ্রেণি ভেরিয়েবলের দ্বারা ব্যাক আপ করা কোনও সম্পত্তি নয়, পরিবর্তে এর মান getপদ্ধতিটি ব্যবহার করে গণনা করা হয় এবং পদ্ধতিটির মাধ্যমে সঞ্চিত হয় set- সাধারণত গেটর এবং সেটার হিসাবে উল্লেখ করা হয় ।

আপনি যখন এই সম্পত্তিটি ব্যবহার করুন:

var cp = myClass.perimeter

আপনি getকোড ব্লকের মধ্যে থাকা কোডটিকে অনুরোধ করছেন এবং আপনি যখন এটি ব্যবহার করেন:

myClass.perimeter = 5.0

আপনি setকোড ব্লকে থাকা কোডটি চালাচ্ছেন, যেখানে newValueঅ্যাসাইনমেন্ট অপারেটরের ডানদিকে প্রদত্ত মানটি স্বয়ংক্রিয়ভাবে পূরণ হবে।

গেটার এবং সেটর উভয়ই নির্দিষ্ট করা থাকলে গণিত বৈশিষ্ট্যগুলি পঠন লিখন, বা কেবলমাত্র প্রাপ্তি নির্দিষ্ট করা থাকলে পঠনযোগ্য হতে পারে।


0

ভেরিয়েবল ঘোষণা করে এবং ক্লাসে এভাবে কল করে

class X {
    var x: Int = 3

}
var y = X()
print("value of x is: ", y.x)

//value of x is:  3

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

class X {
    var _x: Int = 3
    var x: Int {
        get {
            return _x
        }
        set(newVal) {  //set always take 1 argument
            if newVal >= 3 {
             _x = newVal //updating _x with the input value by the user
            print("new value is: ", _x)
            }
            else {
                print("error must be greater than 3")
            }
        }
    }
}
let y = X()
y.x = 1
print(y.x) //error must be greater than 3
y.x = 8 // //new value is: 8

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

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