সুইফ্ট প্রোগ্রামিং: সঞ্চিত সম্পত্তিতে গেটর / সেটার


102

আমি কীভাবে সুইফটে সঞ্চিত সম্পত্তির সেটারটিকে ওভাররাইট করব?

ওবজে-সি-তে, আমি এর সেটারটি ওভাররাইট করতে পারি, তবে স্যুইফ্ট সংরক্ষণকৃত সম্পত্তির জন্য গেটর / সেটারগুলি ব্যবহার করে সন্তুষ্ট বলে মনে হয় না।

বলুন আমার কাছে Cardএকটি সম্পত্তি আছে যার সাথে ডাকা একটি ক্লাস আছে rank। আমি ক্লায়েন্টকে এটিকে কোনও অবৈধ মান দিতে চাই না, অতএব, উদ্দেশ্য-সি-তে, আমি ওভাররাইট করতে পারি setRankযাতে এটি অতিরিক্ত পরীক্ষা করে। তবে willSetসুইফটে সাহায্য করার জন্য মনে হচ্ছে না কারণ newValueধ্রুবক এবং সেটাকে কোনও rankলুপে ডাকা হবে বলে নির্ধারিত করার কোনও মানে হয় না।


আপনি কি এটি করার কোনও উপায় খুঁজে পেয়েছেন? আমার নিজের মতো এই ধরনের কার্যকারিতা প্রয়োজন ...
মিহাই ফ্রেতু

আমি এটি খুঁজে পেয়েছি। আমার উত্তরটি দেখুন ...
মিহাই ফ্রাতু

ডিগেট বা অ্যানালগ সম্পর্কে কী?
fnc12

উত্তর:


107

ঠিক আছে. আপেল ডকুমেন্টেশন মাধ্যমে পড়া উপর সুইফট আমি দেখেছি এই :

আপনি যদি তার নিজস্ব ডিডসেট পর্যবেক্ষকের মধ্যে কোনও সম্পত্তিকে কোনও মূল্য নির্ধারণ করেন, আপনি যে নতুন মান নির্ধারণ করেছেন তা সবেমাত্র সেট করা প্রতিস্থাপন করবে।

সুতরাং আপনাকে যা করতে হবে তা হ'ল:

var rank: Int = 0 {
    didSet {
        // Say 1000 is not good for you and 999 is the maximum you want to be stored there
        if rank >= 1000  {
            rank = 999
        }
    }
}

ডিগেট বা অ্যানালগ সম্পর্কে কী?
fnc12

নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। আপনি আরও নির্দিষ্ট করতে পারেন, দয়া করে?
মিহাই ফ্রাতু

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

আপনার কাছে কেবল একটি গণনীয় সম্পত্তির জন্য একজন গিটার থাকতে পারে। উদাহরণস্বরূপvar rankTimesTwo: Int { get { return rank * 2 } }
মিহাই ফ্রাতু

2
একটি যাদুমন্ত্র মত কাজ করে! সাবধানে সম্পত্তি (সেট) এ সেট করার সময় এটি কল করা হবে না
ক্রিস্টোফ

35

আপনি ওভাররাইড করতে পারবে না get/ setএকটি সংরক্ষিত সম্পত্তি জন্য কিন্তু আপনি সম্পত্তি পর্যবেক্ষক ব্যবহার করতে পারেন willSet/ didSet:

var totalSteps: Int = 0 {
    willSet(newTotalSteps) {
        println("About to set totalSteps to \(newTotalSteps)")
    }
    didSet {
        if totalSteps > oldValue  {
            println("Added \(totalSteps - oldValue) steps")
        }
    }
}

ডিফল্ট প্যারামিটারের নামগুলি এর newValueজন্য willSetএবং এর oldValueজন্য হয় didSetবা আপনি সেগুলি নিজের নামে রাখতে পারেন willSet(newTotalSteps)


এইটা কাজ করে. তবে আমার সমস্যা সমাধান করে না, সম্ভবত আমার মূল প্রশ্নে আমি যথেষ্ট পরিষ্কার ছিলাম না।
বোহানল

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

2
আমি কী বলতে চাইছি তা সম্পূর্ণরূপে নিশ্চিত নই তবে এটি সেট হয়ে যাওয়ার পরে আপনি এটি didSetপরীক্ষা করতে পারবেন না rankএবং যদি এটি বৈধতা ব্যর্থ হয় তবে এটিকে অন্য কোনও কিছুতে পুনরায় সেট করুন oldValue?
জোসেফ মার্ক

9

পেতে এবং সেট গণনা করা বৈশিষ্ট্যের জন্য (তাদের কোনও ব্যাকিং স্টোর নেই)। (আমার মতে, 'ভার' শব্দটি এখানে বিভ্রান্ত করছে)

  • উইলসেট এবং ডুডসেটকে একটি উদাহরণ ভেরিয়েবলের জন্য ডাকা হয় (কোনও পরিবর্তনকে ওভাররাইড করতে ডডসেট ব্যবহার করুন)
  • সেট এবং পেতে নিখুঁতভাবে গণিত সম্পত্তি জন্য

9

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

private var _foo:Int = 0
var foo:Int {
    get {
        return _foo
    }
    set {
        if(newValue > 999) {
            _foo = 999
        } else {
            _foo = newValue
        }
    }
}

বা:

private var _foo:Int = 0
var foo:Int {
    get {
        return _foo
    }
    set {
        guard newValue <= 999 else {
            _foo = 999
            return
        }
        _foo = newValue
    }
}

এটি দুটি ভেরিয়েবল ব্যবহার করে বোঝা যায় না।
পীযূষ

1
এটি কেবলমাত্র একটি সম্পত্তি (ভেরিয়েবল) ব্যবহার করছে: fooএটি কেবল একটি গণিতের অভিব্যক্তি _foo, "ভার" কীওয়ার্ডটি আপনাকে বোকা বানাবেন না! এর অর্থ এই নয় যে প্রাইভেট নেমস্পেস থেকে অ্যাক্সেসযোগ্য দুটি এন্ট্রি রয়েছে তবে এটির সুরক্ষিত / পাবলিকের কোনও প্রভাব নেই এবং সর্বদা বৈধের মান রাখে foo। এটি মূলত "দেখুন" প্যাটার্ন। সমস্যা আপনার সাথে পেতে rewriting মাধ্যমে didSet, এটা অবৈধ হচ্ছে একটি নির্দিষ্ট সময়ের থাকার ছাড়াও, একটি অসীম লুপ জন্য যে উল্লেখযোগ্য সম্ভাব্য যেহেতু আপনি reentering করছি didSetভিতর থেকে হ্যান্ডলার didSet
জিম ড্রিসকল

-8

সরলীকৃত উদাহরণ:

class Shape {
    var sideLength: Double {
    get {
        return self.sideLength
    }
    set {
        // Implement the setter here.
        self.sideLength = newValue
    }
    }
}

পুরো উদাহরণ

পরীক্ষা করে দেখুন perimeterএই উদাহরণে হবে।

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

class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0

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

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

    override func simpleDescription() -> String {
        return "An equilateral triagle with sides of length \(sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength”

3
এই ক্ষেত্রে, perimeterএখনও একটি গণিত সম্পত্তি। কোনও গণিত সম্পত্তি পরিচয় না দিয়ে আমি কীভাবে পাশের দৈর্ঘ্যটি ওভাররাইট করব?
বোহানল

@ বোহান আমি ব্যবহার করে একটি সরল উদাহরণ যুক্ত করেছি getএবংset
মাইক রাপাদাস

6
আপনার "সম্পূর্ণ উদাহরণ" কোনও গণিত সম্পত্তি দেখায়, কোনও সঞ্চিত সম্পত্তি নয় এবং আপনার "সরলীকৃত উদাহরণ" কাজ করে না।
কালেব

আমি সংশোধন করেছি. এটি মনে হয় যেন অবজেক্টি-সি এর @ প্রোপার্টি (অটো-সিনথেসাইজড গেটার + সেটটার) এর বিমূর্তিটি সুইফটে নিরবচ্ছিন্ন হয়েছে।
বিড়ম্বনা

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