swift - সম্পত্তি পেতে এবং setters




properties compiler-warnings (7)

এই সহজ ক্লাস দিয়ে আমি কম্পাইলার সতর্কতা পেয়েছি

নিজস্ব সেট্টার / গটারের মধ্যে x পরিবর্তন / অ্যাক্সেস করার চেষ্টা করা হচ্ছে

এবং যখন আমি এটি ব্যবহার করি:

var p: point = Point()
p.x = 12

আমি একটি EXC_BAD_ACCESS পাই। Ivars স্পষ্ট ব্যাকিং ছাড়া আমি এটা কিভাবে করতে পারি?

class Point {

    var x: Int {
        set {
            x = newValue * 2 //Error
        }
        get {
            return x / 2 //Error
        }
    }
    // ...
}

আপডেট: সুইফ্ট 4

নীচের বর্গের sideLength এবং sideLength পরিবর্তনশীল sideLength প্রয়োগ করা হয়

class Triangle: {
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String) { //initializer method
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }

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

বস্তু তৈরি করা

var triangle = Triangle(sideLength: 3.9, name: "a triangle")

গেটার

print(triangle.perimeter) // invoking getter

গোয়েন্দা

triangle.perimeter = 9.9 // invoking setter

Gozoner এর উত্তর বিস্তারিত জানার জন্য:

এখানে আপনার আসল সমস্যা আপনি recursively আপনার গটার কলিং হয়।

var x:Int
    {
        set
        {
            x = newValue * 2 // This isn't a problem
        }
        get {
            return x / 2 // Here is your real issue, you are recursively calling 
                         // your x property's getter
        }
    }

কোডের মত মন্তব্যটি উপরে পরামর্শ দেওয়া হয়েছে, আপনি এক্স সম্পত্তির গেট্টারকে অসীম কলিং করছেন, যা আপনাকে EXC_BAD_ACCESS কোড না পাওয়া পর্যন্ত চালানো চালিয়ে যাবে (আপনি আপনার Xcode এর খেলার মাঠের পরিবেশের নীচের ডান কোণায় স্পিনার দেখতে পাবেন)।

সুইফ্ট ডকুমেন্টেশন থেকে উদাহরণ বিবেচনা করুন:

struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct AlternativeRect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

নোটিশ কিভাবে কেন্দ্র গণিত সম্পত্তি পরিবর্তন বা পরিবর্তনশীল এর ঘোষণায় নিজেই ফেরত না।


আপনি recursively x সঙ্গে x সংজ্ঞায়িত করা হয়। যেমন কেউ আপনাকে জিজ্ঞেস করে, আপনার বয়স কত? এবং আপনি উত্তর দিবেন "আমি আমার বয়স দ্বিগুণ"। যা অর্থহীন।

আপনি অবশ্যই বলবেন আমি দুবার যোহনের বয়স বা অন্য কোনো পরিবর্তনশীল কিন্তু নিজেকে।

গণিত ভেরিয়েবল সবসময় অন্য পরিবর্তনশীল উপর নির্ভরশীল।

থাম্ব নিয়ম নিয়ন্ত্রক মধ্যে get থেকে নিজেই সম্পত্তি অ্যাক্সেস না হয়। অন্য ট্রিগার get যা অন্য ট্রিগার কারণ যে। । । এমনকি এটি মুদ্রণ করবেন না। মুদ্রণের জন্য এটি মুদ্রণ করার আগেও মানটি পেতে 'পাওয়ার' দরকার!

struct Person{
    var name: String{
        get{
            print(name) // DON'T do this!!!!
            return "as"
        }
        set{
        }
    }
}

let p1 = Person()

যেহেতু নিম্নলিখিত সতর্কবাণী দিতে হবে:

এটির নিজস্ব গেটর থেকে 'নাম' অ্যাক্সেস করার চেষ্টা করছে।

ত্রুটি এই মত অস্পষ্ট দেখায়:

বিকল্প হিসাবে আপনি didSet ব্যবহার করতে পারেন। didSet আপনি যে মানটি আগে সেট করা হয়েছিল সেটিকে ধরে রাখুন এবং সেটিকে সেট করুন। আরো এই উত্তর দেখতে।


আপনি সম্পত্তি পর্যবেক্ষক ব্যবহার করে সেট মান কাস্টমাইজ করতে পারেন। এই সেটটি 'সেট' এর পরিবর্তে 'didSet' ব্যবহার করতে।

class Point {

var x:Int {
    didSet {
        x = x * 2
    }
}
...

গটার জন্য ...

class Point {

var doubleX: Int {
    get {
        return x / 2
    }
}
...

এখানে একটি তাত্ত্বিক উত্তর। যে here পাওয়া here

একটি {সেট করুন} সম্পত্তি একটি ধ্রুবক সংরক্ষিত সম্পত্তি হতে পারে না। এটি একটি গণিত সম্পত্তি হওয়া উচিত এবং উভয় পেতে এবং সেট প্রয়োগ করা উচিত।


সুইফ্ট মধ্যে সেটters এবং getters গণিত বৈশিষ্ট্য / পরিবর্তনশীল প্রয়োগ। এই বৈশিষ্ট্য / ভেরিয়েবল আসলে মেমরির মধ্যে সংরক্ষিত হয় না, বরং সঞ্চিত সম্পত্তি / ভেরিয়েবলের মানের উপর ভিত্তি করে গণনা করা হয়।

বিষয়টির উপর অ্যাপল এর সুইফ্ট ডকুমেন্টেশন দেখুন: সুইফট পরিবর্তনশীল ঘোষণাপত্র


setter ভেরিয়েবলগুলির জন্য setter এবং getter ওভাররাইড করার জন্য নীচের দেওয়া কোডটি ব্যবহার করুন

var temX : Int? 
var x: Int?{

    set(newX){
       temX = newX
    }

    get{
        return temX
    }
}

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

আমরা শুধু এই মত Setter আহ্বান করতে পারেন

x = 10

কোডার প্রদত্ত লাইনের নিচে ফায়ারিংয়ে গেটরকে আহ্বান করা হবে

var newVar = x




getter-setter