objective c - সুইফ্ট মধ্যে শুধুমাত্র-পড়া এবং অ-কম্পিউটেড পরিবর্তনশীল বৈশিষ্ট্য




objective-c swift (3)

আপনি কি চান দুটি মৌলিক উপায় আছে। প্রথম উপায় হচ্ছে একটি ব্যক্তিগত সম্পত্তি এবং একটি জনসাধারণের গণিত সম্পত্তি যা সেই সম্পত্তি প্রদান করে:

public class Clock {

  private var _hours = 0

  public var hours: UInt {
    return _hours
  }

}

তবে "সুইফ্ট প্রোগ্রামিং ভাষা" বইয়ের "অ্যাক্সেস কন্ট্রোল" বিভাগে বর্ণিত হিসাবে, এটি একটি ভিন্ন, ক্ষুদ্র উপায়ে অর্জন করা যেতে পারে:

public class Clock {

    public private(set) var hours = 0

}

একটি সরল নোট হিসাবে, একটি পাবলিক টাইপ ঘোষণা করার সময় আপনি একটি পাবলিক ইনিশিয়েটিজার প্রদান করা আবশ্যক। এমনকি যদি আপনি সমস্ত বৈশিষ্ট্যের ডিফল্ট মান প্রদান করেন তবে init() অবশ্যই স্পষ্টভাবে জনসাধারণের সংজ্ঞায়িত করা আবশ্যক:

public class Clock {

    public private(set) var hours = 0

    public init() {
      hours = 0
    }
    // or simply `public init() {}`

}

এটি ডিফল্ট প্রারম্ভিকদের কথা বলার সময় বইটির একই বিভাগেও ব্যাখ্যা করা হয়েছে।

আমি নতুন অ্যাপল সুইফ্ট ভাষা দিয়ে কিছু খুঁজে বের করার চেষ্টা করছি। ধরুন আমি উদ্দেশ্য-সিতে নিচের মত কিছু করতে চাই। আমি readonly বৈশিষ্ট্য আছে, এবং তারা পৃথকভাবে পরিবর্তন করা যাবে না। যাইহোক, একটি নির্দিষ্ট পদ্ধতি ব্যবহার করে, বৈশিষ্ট্য একটি যৌক্তিক ভাবে পরিবর্তিত হয়।

আমি নিম্নলিখিত উদাহরণ, একটি খুব সহজ ঘড়ি নিতে। আমি উদ্দেশ্য-সি এই লিখতে হবে।

@interface Clock : NSObject

@property (readonly) NSUInteger hours;
@property (readonly) NSUInteger minutes;
@property (readonly) NSUInteger seconds;

- (void)incrementSeconds;

@end

@implementation Clock

- (void)incrementSeconds {
     _seconds++;

     if (_seconds == 60) {
        _seconds = 0;
        _minutes++;

         if (_minutes == 60) {
            _minutes = 0;
            _hours++;
        }
    }
}

@end

একটি নির্দিষ্ট উদ্দেশ্যের জন্য, আমরা সেকেন্ড, মিনিট এবং ঘন্টা সরাসরি স্পর্শ করতে পারছি না, এবং এটি কেবল একটি পদ্ধতি ব্যবহার করে সেকেন্ড সেকেন্ডে বাড়ানোর অনুমতি দেয়। শুধুমাত্র এই পদ্ধতিটি ইনস্ট্যান্স ভেরিয়েবলের কৌশল ব্যবহার করে মানগুলি পরিবর্তন করতে পারে।

যেহেতু সুইফ্টে এমন কোনও জিনিস নেই, তাই আমি সমতুল্য খুঁজতে চেষ্টা করছি। যদি আমি এটা করি:

class Clock : NSObject {

    var hours:   UInt = 0
    var minutes: UInt = 0
    var seconds: UInt = 0

    func incrementSeconds() {

        self.seconds++

        if self.seconds == 60 {

            self.seconds = 0
            self.minutes++

            if self.minutes == 60 {

                self.minutes = 0
                self.hours++
            }
        }
    }
}

যে কাজ করবে, কিন্তু যে কেউ সরাসরি বৈশিষ্ট্য পরিবর্তন করতে পারে।

সম্ভবত আমি ইতিমধ্যেই Objective-C তে একটি খারাপ নকশা তৈরি করেছি এবং সেই কারণে সম্ভাব্য নতুন সুইফ্ট সমতুল্য জ্ঞান তৈরি করছে না। যদি না হয় এবং কেউ উত্তর থাকে, আমি খুব কৃতজ্ঞ হবে;)

সম্ভবত ভবিষ্যতে অ্যাক্সেস কন্ট্রোল মেকানিজম অ্যাপল দ্বারা প্রতিশ্রুত উত্তর?

ধন্যবাদ!


প্রকৃতপক্ষে অ্যাক্সেস কন্ট্রোল (যা এখনো সুইফ্টে বিদ্যমান নেই) হিসাবে আপনি উদ্দেশ্য সি তে ভাবতে পারেন না হিসাবে প্রয়োগ করা হয় না। লোকেরা যদি সত্যিই চান তবে সরাসরি আপনার পাঠযোগ্য ভেরিয়েবলগুলি সংশোধন করতে পারে। তারা শুধু ক্লাসের পাবলিক ইন্টারফেসের সাথে এটি করে না।

আপনি সুইফ্টে কিছু করতে পারেন (আপনার কোড কাটুন এবং পেস্ট করুন, প্লাস কিছু পরিবর্তন, আমি এটি পরীক্ষা করে দেখিনি):

class Clock : NSObject {

    var _hours:   UInt = 0
    var _minutes: UInt = 0
    var _seconds: UInt = 0

    var hours: UInt {
    get {
      return _hours
    }
    }

    var minutes: UInt {
    get {
      return _minutes
    }
    }

    var seconds: UInt  {
    get {
      return _seconds
    }
    }

    func incrementSeconds() {

        self._seconds++

        if self._seconds == 60 {

            self._seconds = 0
            self._minutes++

            if self._minutes == 60 {

                self._minutes = 0
                self._hours++
            }
        }
    }
}

যা আপনার কাছে Objective C তে যা আছে তার মতোই যে প্রকৃত সঞ্চয় করা সম্পত্তিগুলি জনসাধারণের ইন্টারফেসে দৃশ্যমান।

দ্রুত আপনি আরও কিছু আকর্ষণীয় করতে পারেন, যা আপনি উদ্দেশ্য সিতেও করতে পারেন, তবে এটি সম্ভবত দ্রুততর (ব্রাউজারে সম্পাদনা করা হয়েছে, আমি এটি পরীক্ষা করে দেখিনি):

class Clock : NSObject {

    var hours: UInt = 0

    var minutes: UInt {
    didSet {
      hours += minutes / 60
      minutes %= 60
    }
    }

    var seconds: UInt  {
    didSet {
      minutes += seconds / 60
      seconds %= 60
    }
    }

    // you do not really need this any more
    func incrementSeconds() {
        seconds++
    }
}

শুধু private(set) সঙ্গে সম্পত্তি ঘোষণা prefix, তাই ভালো:

public private(set) var hours:   UInt = 0
public private(set) var minutes: UInt = 0
public private(set) var seconds: UInt = 0

private এটি একটি উৎস ফাইল স্থানীয় রাখে, internal এটি মডিউল / প্রকল্প স্থানীয় রাখে।

private(set) read-only একটি read-only সম্পত্তি তৈরি করে, private সেট উভয় set এবং ব্যক্তিগত get







properties