স্বতন্ত্র পাঠযোগ্যভাবে বহিরাগত, স্বরলিখন অভ্যন্তরীণ সম্পত্তি


103

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

অবজেক্টিভ-সি-তে, নিম্নলিখিত বিকল্পগুলি রয়েছে:

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

জাভাতে সম্মেলনটি হ'ল:

  • একটি সুরক্ষিত ক্ষেত্র ঘোষণা করুন এবং একটি সর্বজনীন, কেবল পঠনযোগ্য প্রাপ্তি পদ্ধতি (পদ্ধতি) প্রয়োগ করুন।

সুইফট এর প্রতিবাদ কী?

উত্তর:


219

একটি শ্রেণীর সম্পত্তি দেওয়া, আপনি অ্যাসেস মডিফায়ারের সাথে সম্পত্তি getবা তার পরে বা setপ্রথমটির মধ্যের মধ্যে সম্পত্তি ঘোষণার উপসর্গ করে একটি আলাদা অ্যাক্সেস স্তর নির্দিষ্ট করতে পারেন । উদাহরণস্বরূপ, পাবলিক গেটর এবং একটি প্রাইভেট সেটার সহ শ্রেণীর সম্পত্তি হিসাবে ঘোষণা করা হবে:

private(set) public var readonlyProperty: Int

প্রস্তাবিত পাঠ: গেটারস এবং সেটার্স

অ্যাক্সেসিবিলিটি স্তর সম্পর্কে মার্টিনের বিবেচনাগুলি এখনও বৈধ - অর্থাত্ কোনও protectedসংশোধক নেই, internalকেবলমাত্র মডিউলটিতে কেবলমাত্র privateবর্তমান ফাইলটিতে অ্যাক্সেসকে সীমাবদ্ধ করে এবং publicকোনও সীমাবদ্ধতা ছাড়াই।

সুইফট 3 নোট

2 নতুন এক্সেস সংশোধনকারীদের, fileprivateএবং open, ভাষা যোগ করা হয়েছে যখন privateএবং publicসামান্য পরিবর্তন করা হয়ঃ

  • openকেবল শ্রেণি এবং শ্রেণীর সদস্যদের জন্যই প্রযোজ্য: এটি কোনও শ্রেণিকে সাবক্ল্যাসড করার অনুমতি দিতে বা কোনও সদস্যকে মডিউলটির বাইরে ওভাররাইড করার মঞ্জুরি দেয় যেখানে তারা সংজ্ঞায়িত হয়। publicপরিবর্তে শ্রেণি বা সদস্যটিকে সর্বজনীনভাবে অ্যাক্সেসযোগ্য করে তোলে, তবে উত্তরাধিকারসূত্রে বা অতিরিক্ত ছাড়িয়ে নেওয়া যায় না

  • privateএখন কেবল কোনও সংযুক্তকরণের ঘোষণা থেকে কোনও সদস্যকে দৃশ্যমান এবং অ্যাক্সেসযোগ্য করে তোলে, fileprivateযেখানে এটি উপস্থিত রয়েছে এমন পুরো ফাইলটিতে

আরও বিশদ এখানে


নিস! (অনুপস্থিত varকীওয়ার্ডটি সংকলন করার জন্য আমি স্বাধীনতা নিয়েছি ।)
মার্টিন আর

ওহ অনেক ধন্যবাদ :) আমি সাধারণত খেলার মাঠ এবং পেস্ট থেকে অনুলিপি করি, তবে এবার আমি সম্ভবত এটি ভুল করে ফেলেছি।
অ্যান্টোনিও

10
নোট করুন publicinternalpublicinternalprivate(set) var readonlyProperty: Int
-2015 অনুসারে এই বাক্য গঠনটি

1
ভাল বাক্য গঠনটি বিবেচনায় নেওয়া সঠিক যে কোডটির আগে আমি একটি পাবলিক গেটার এবং একটি প্রাইভেট সেটার সহ একটি শ্রেণি সম্পত্তি লিখেছিলাম - এটি কেবল একটি উদাহরণ। তবে হ্যাঁ, বৈশিষ্ট্যগুলির জন্য অ্যাক্সেস মডিফায়ারগুলি অবশ্যই শ্রেণি / কাঠামো অ্যাক্সেস পরিবর্তকের সাথে "সামঞ্জস্যপূর্ণ" হতে হবে।
আন্তোনিও

শেষ অনুচ্ছেদের বিষয়ে, আমার ধারণা উত্তরটি লেখার পর থেকে এটি পরিবর্তিত হয়েছে তবে privateএখনকার ঘোষণায় সীমাবদ্ধ (ফাইল নয়) এবং fileprivateবর্তমান ফাইলটিতে সীমাবদ্ধ থাকার জন্য এটি উপলব্ধ। এছাড়াও publicকিছু বিধিনিষেধ আছে এবং openকোন সীমাবদ্ধতার জন্য এটি প্রয়োজন। বিশদ এখানে
নাইজেল বি পেক

2

@ অ্যান্টোনিও অনুসারে, আমরা readOnlyজনসাধারণ এবং readWriteব্যক্তিগতভাবে সম্পত্তি মূল্য হিসাবে অ্যাক্সেসের জন্য একটি একক সম্পত্তি ব্যবহার করতে পারি । নীচে আমার চিত্রণ:

class MyClass {

    private(set) public var publicReadOnly: Int = 10

    //as below, we can modify the value within same class which is private access
    func increment() {
        publicReadOnly += 1
    }

    func decrement() {
        publicReadOnly -= 1
    }
}

let object = MyClass()
print("Initial  valule: \(object.publicReadOnly)")

//For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible"
//object.publicReadOnly += 1

object.increment()
print("After increment method call: \(object.publicReadOnly)")

object.decrement()
print("After decrement method call: \(object.publicReadOnly)")

এবং এখানে ফলাফল:

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