সুইফট অ্যাক্সেস সংশোধক আছে?


273

উদ্দেশ্য-সি উদাহরণে ডেটা হতে পারে public, protectedবা private। উদাহরণ স্বরূপ:

@interface Foo : NSObject
{
  @public
    int x;
  @protected:
    int y;
  @private:
    int z;
  }
-(int) apple;
-(int) pear;
-(int) banana;
@end

আমি সুইফ্ট রেফারেন্সে অ্যাক্সেস সংশোধকগুলির কোনও উল্লেখ পাইনি। সুইফটে ডেটার দৃশ্যমানতা সীমাবদ্ধ করা সম্ভব?


আমিও না. অ্যাপলের কমপক্ষে বেসরকারীদের জন্য শিষ্টাচারের পরিচয় দেওয়া উচিত, যেমন অজগর যেমন তারা আন্ডারস্কোর সহ উপস্থাপিত হয়।
সিয়েন্টিক


উত্তর:


419

এর মতো সুইফট 3.0.1 , আছে এক্সেস 4 মাত্রা সর্বনিম্ন (অধিকাংশ নিয়ন্ত্রণমূলক) এর সর্বোচ্চ (অন্তত নিয়ন্ত্রণমূলক) থেকে নীচে বর্ণিত।


1. openএবংpublic

সংজ্ঞায়িত মডিউল (লক্ষ্য) এর বাইরে ব্যবহারের জন্য কোনও সত্তাকে সক্ষম করুন। কোনও ফ্রেমওয়ার্কে পাবলিক ইন্টারফেস নির্দিষ্ট করার সময় আপনি সাধারণত ব্যবহার openবা publicঅ্যাক্সেস করেন।

তবে openঅ্যাক্সেস কেবলমাত্র ক্লাস এবং শ্রেণীর সদস্যদের জন্য প্রযোজ্য এবং এটি publicঅ্যাক্সেস থেকে নীচে পৃথক :

  • public ক্লাস এবং ক্লাসের সদস্যরা কেবল সংজ্ঞায়িত মডিউল (লক্ষ্য) এর মধ্যে সাবক্ল্যাসড এবং ওভাররাইড করা যায়।
  • open ক্লাস এবং ক্লাসের সদস্যরা সংজ্ঞায়িত মডিউল (লক্ষ্য) এর বাইরে এবং বাইরে উভয়কে সাবক্ল্যাসড এবং ওভাররাইড করা যায়।

// First.framework – A.swift

open class A {}

// First.framework – B.swift

public class B: A {} // ok

// Second.framework – C.swift

import First

internal class C: A {} // ok

// Second.framework – D.swift

import First

internal class D: B {} // error: B cannot be subclassed

2। internal

সংজ্ঞায়িত মডিউল (লক্ষ্য) এর মধ্যে ব্যবহার করতে কোনও সত্তাকে সক্ষম করে। internalকোনও অ্যাপ্লিকেশন বা ফ্রেমওয়ার্কের অভ্যন্তরীণ কাঠামো সংজ্ঞায়িত করার সময় আপনি সাধারণত অ্যাক্সেস ব্যবহার করেন ।

// First.framework – A.swift

internal struct A {}

// First.framework – B.swift

A() // ok

// Second.framework – C.swift

import First

A() // error: A is unavailable

3। fileprivate

সত্তার ব্যবহারটিকে তার সংজ্ঞায়িত উত্স ফাইলটিতে সীমাবদ্ধ করে। আপনি fileprivateযখন পুরো ফাইলের মধ্যে এই বিবরণগুলি ব্যবহার করেন তখন সাধারণত কার্যকারিতার একটি নির্দিষ্ট অংশের প্রয়োগের বিশদটি গোপন করতে অ্যাক্সেস ব্যবহার করেন ।

// First.framework – A.swift

internal struct A {

    fileprivate static let x: Int

}

A.x // ok

// First.framework – B.swift

A.x // error: x is not available

4। private

কোনও সত্তার ব্যবহারকে এর ঘেরিতকরণের ঘোষণার মধ্যে সীমাবদ্ধ করে। আপনি privateকেবলমাত্র কোনও একক ঘোষণার মধ্যে যখন নির্দিষ্ট বিবরণ ব্যবহার করা হয় তখন কার্যকারিতার নির্দিষ্ট অংশের প্রয়োগের বিশদটি গোপন করতে আপনি অ্যাক্সেস ব্যবহার করেন ।

// First.framework – A.swift

internal struct A {

    private static let x: Int

    internal static func doSomethingWithX() {
        x // ok
    }

}

A.x // error: x is unavailable

37
কেউ আমাকে বোঝাতে পারেন কেন এটি বড় ব্যাপার নয়?
জাকী জার্মান

15
OOP এ সর্বদা কিছু পদ্ধতি বা ভেরিয়েবল থাকে যা ব্যক্তিগত বা সুরক্ষিত হওয়া উচিত। এটি সলআইড ডিজাইন বাস্তবায়নের জন্য অনুমতি দেয় , কারণ বড় পদ্ধতিগুলি কয়েকটি নিজস্বকে আলাদা আলাদা করে বিভক্ত করা হয় যার প্রত্যেকটির নিজস্ব দায়বদ্ধতা ওভাররেড করা যায় তবে কেবলমাত্র "প্রধান" পদ্ধতিটি জনসাধারণের ব্যবহারের জন্য উপলব্ধ হওয়া উচিত।
আকাশীবস্কি

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

10
এক্সকোড 6 বিটা প্রকাশের নোটগুলি বলে: "এই বীজে অ্যাক্সেস নিয়ন্ত্রণ (পাবলিক / প্রাইভেট সদস্য) সক্ষম নয়।" (15747445) "
মার্টিন

9
@alcalde একটি পাবলিক ইন্টারফেসের ধারণাটি অত্যন্ত মূল্যবান। যদি আপনি মনস্থ করেন যে কোনও শ্রেণীর সমস্ত কোড অবশ্যই জনসাধারণের API এর অংশ হিসাবে রয়েছে এমন ফাংশনগুলির অভ্যন্তরে বাস করা উচিত, আমি মনে করি এটি বেশ সীমাবদ্ধ। অন্যদিকে, একটি নির্দিষ্ট পাবলিক এপিআই থাকা গ্রাহকদের বাধা না দিয়ে বাস্তবায়ন (ব্যক্তিগত পদ্ধতি ব্যবহার সহ) পরিবর্তনের অনুমতি দেয়। যদি কারও অভ্যন্তরীণ শ্রেণির পদ্ধতি ব্যবহারের 'প্রয়োজন' হয় তবে আমার মনে হয় তারা শ্রেণীর সীমাবদ্ধতার ভুল বোঝাচ্ছে 'কার্যকারিতা (বা বগী শ্রেণি ব্যবহারের চেষ্টা করছে)।
জিঙ্গলেস্টুলা

26

সুইফট 4 / সুইফট 5

সুইফ্ট ডকুমেন্টেশন - অ্যাক্সেস নিয়ন্ত্রণে উল্লিখিত অনুসারে , সুইফটে 5 টি অ্যাক্সেস নিয়ন্ত্রণ রয়েছে :

  • উন্মুক্ত এবং সর্বজনীন : তাদের মডিউলটির সত্ত্বা এবং সংশোধিত মডিউলটি আমদানি করে এমন কোনও মডিউলের সত্তা থেকে অ্যাক্সেস করা যায়।

  • অভ্যন্তরীণ : কেবলমাত্র তাদের মডিউলগুলির সত্তা থেকে অ্যাক্সেস করা যায়। এটি ডিফল্ট অ্যাক্সেস স্তর।

  • ফাইলপ্রাইভেট এবং ব্যক্তিগত : কেবলমাত্র যেখানে আপনি সেগুলি সংজ্ঞায়িত করেন সেখানে কেবল সীমিত সুযোগের মধ্যেই প্রবেশাধিকার পাওয়া যায়।



খোলা এবং জনসাধারণের মধ্যে পার্থক্য কী ?

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

প্রকাশ্য অন্যান্য মডিউল থেকে ক্লাস তাদের ব্যবহার করেন, কিন্তু করার অনুমতি দেয় না , তাদের উত্তরাধিকারী অর্থাত তারা করতে পারবে না অন্যান্য মডিউল থেকে subclassed হবে না। এছাড়াও, তারা অন্যান্য মডিউলগুলির সদস্যদের এগুলি ব্যবহার করার অনুমতি দেয়, তবে সেগুলি ওভাররাইড করতে দেয় না। তাদের মডিউলগুলির জন্য, তাদের একই খোলা যুক্তি রয়েছে (তারা ক্লাসগুলি তাদের ব্যবহার এবং উত্তরাধিকার সূত্রে অনুমতি দেয়; তারা সদস্যদের তাদের ব্যবহার এবং ওভাররাইড করার অনুমতি দেয়)।


ফাইলপ্রাইভেট এবং প্রাইভেটের মধ্যে পার্থক্য কী ?

fileprivate তাদের সম্পূর্ণ ফাইল থেকে অ্যাক্সেস করা যেতে পারে।

ব্যক্তিগত কেবল তাদের একক ঘোষণা থেকে এবং একই ফাইলটিতে থাকা সেই ঘোষণার এক্সটেনশানগুলিতে অ্যাক্সেস করা যায় ; এই ক্ষেত্রে:

// Declaring "A" class that has the two types of "private" and "fileprivate":
class A {
    private var aPrivate: String?
    fileprivate var aFileprivate: String?

    func accessMySelf() {
        // this works fine
        self.aPrivate = ""
        self.aFileprivate = ""
    }
}

// Declaring "B" for checking the abiltiy of accessing "A" class:
class B {
    func accessA() {
        // create an instance of "A" class
        let aObject = A()

        // Error! this is NOT accessable...
        aObject.aPrivate = "I CANNOT set a value for it!"

        // this works fine
        aObject.aFileprivate = "I CAN set a value for it!"
    }
}



সুইফট 3 এবং সুইফট 4 অ্যাক্সেস নিয়ন্ত্রণের মধ্যে পার্থক্যগুলি কী কী?

এসই -0169 প্রস্তাবে উল্লিখিত হিসাবে , সুইফট 4 - এ একমাত্র পরিমার্জন যুক্ত করা হয়েছে যে একই ফাইলের সেই ঘোষণার এক্সটেনশানগুলি থেকে অ্যাক্সেসযোগ্য হওয়ার জন্য ব্যক্তিগত অ্যাক্সেস নিয়ন্ত্রণের সুযোগটি প্রসারিত করা হয়েছে ; এই ক্ষেত্রে:

struct MyStruct {
    private let myMessage = "Hello World"
}

extension MyStruct {
    func printMyMessage() {
        print(myMessage)
        // In Swift 3, you will get a compile time error:
        // error: 'myMessage' is inaccessible due to 'private' protection level

        // In Swift 4 it should works fine!
    }
}

সুতরাং, পুরো ফাইলটিতে অ্যাক্সেসযোগ্য হওয়ার জন্য ফাইলপ্রাইভেটmyMessage হিসাবে ঘোষণা করার দরকার নেই ।


17

যখন কেউ সুইফ্ট বা ওবিজেসিতে (বা রুবি বা জাভা বা…) একটি "ব্যক্তিগত পদ্ধতি" তৈরি করার কথা বলে তখন সেই পদ্ধতিগুলি আসলে ব্যক্তিগত নয়। তাদের আশেপাশে কোনও আসল অ্যাক্সেস নিয়ন্ত্রণ নেই। যে কোনও ভাষা এমনকি সামান্য অন্তর্নিম্নতা সরবরাহ করে তা বিকাশকারীদের যদি সত্যই তারা চায় তবে শ্রেণীর বাইরে থেকে সেই মানগুলি পেতে দেয়।

সুতরাং আমরা এখানে যে বিষয়ে সত্যই কথা বলছি তা হ'ল একটি জন-মুখোমুখি ইন্টারফেসকে সংজ্ঞায়িত করার একটি উপায় যা আমরা এটির যে কার্যকারিতা চাই তা কেবল উপস্থাপন করে এবং বাকিটিকে "গোপন" করে যা আমরা "ব্যক্তিগত" বলে মনে করি।

ইন্টারফেস ঘোষণার জন্য সুইফট প্রক্রিয়াটি হ'ল protocolএবং এটি এই উদ্দেশ্যে ব্যবহার করা যেতে পারে।

protocol MyClass {
  var publicProperty:Int {get set}
  func publicMethod(foo:String)->String
}

class MyClassImplementation : MyClass {
  var publicProperty:Int = 5
  var privateProperty:Int = 8

  func publicMethod(foo:String)->String{
    return privateMethod(foo)
  }

  func privateMethod(foo:String)->String{
    return "Hello \(foo)"
  }
}

মনে রাখবেন, প্রোটোকলগুলি প্রথম শ্রেণীর ধরণের এবং যে কোনও জায়গায় যে কোনও জায়গায় ব্যবহার করা যেতে পারে। এবং , যখন এই উপায়ে ব্যবহার করা হয়, তখন তারা কেবল তাদের নিজস্ব ইন্টারফেস প্রকাশ করে, বাস্তবায়নকারী ধরণের নয়।

সুতরাং, যতক্ষণ আপনি আপনার প্যারামিটারের প্রকারের MyClassপরিবর্তে ব্যবহার করেন না MyClassImplementation, এগুলি সব ঠিক কাজ করা উচিত:

func breakingAndEntering(foo:MyClass)->String{
  return foo.privateMethod()
  //ERROR: 'MyClass' does not have a member named 'privateMethod'
}

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

var myClass:MyClass = MyClassImplementation()

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


1
যদি প্রোটোকলগুলি আমাদের একটি ডিফল্ট যুক্তি থাকতে দেয় না তবে আমি কীভাবে optionচ্ছিক পরামিতিগুলি যে এখনও প্রোটোকলের সাথে সম্মতি রেখে একটি সর্বজনীন পদ্ধতি তৈরি করতে পারি?
বিডুওরাও

তুমি কী বলতে চাচ্ছ আমি বুঝতে পারছি না। নিম্নলিখিতটি anচ্ছিক প্যারামিটার সহ একটি সর্বজনীন পদ্ধতি তৈরি করে। কোনও সমস্যা বলে মনে হচ্ছে না: gist.github.com/anonymous/17d8d2d25a78644046b6
জেমমন

কিছু কারণে projectচ্ছিক প্যারামিটারটি আমার প্রকল্পে যেমন করা উচিত তেমন কাজ করছে না, ইতিমধ্যে আপনার গিটহাব উদাহরণের অনুরূপ কিছু চেষ্টা করেছিল। যেহেতু আমরা কোনও প্রোটোকলে ডিফল্ট প্যারামিটার সেট করতে পারি না, তাই আমি আটকে গেলাম এবং একটি প্রশ্ন জিজ্ঞাসা করে শেষ করেছি। সাহায্য করার চেষ্টা করার জন্য ধন্যবাদ।
বিডুওরাও

আমরা সবাই জানি যে কোনও কিছু হ্যাকযোগ্য। আমাদের কেবলমাত্র কেন আমাদের সংশোধনকারীদের অ্যাক্সেস দরকার তার কিছু আদেশ দরকার
ক্যানব্যাক্স

14

আমি যতদূর বলতে পারি, 'পাবলিক', 'ব্যক্তিগত' বা 'সুরক্ষিত' কোনও কীওয়ার্ড নেই। এটি পরামর্শ দেবে যে সবকিছু প্রকাশ্য is

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

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


এটি দুর্দান্ত কারণ এটি কাপলিংও হ্রাস করে এবং পরীক্ষা সহজতর করতে পারে।
স্ক্রোগ 1

4
প্রোটোকলটির বাস্তবায়ন শ্রেণিটি আড়াল করার কোনও উপায় থাকলে এটি আরও ভাল কাজ করবে, তবে মনে হয় না।
ডেভিড মোলস

কেউ কি এই প্যাটার্নের উদাহরণস্বরূপ উদাহরণ সরবরাহ করতে পারেন?
bloudermilk

ঠিক আছে, এই উত্তরটি পূর্ববর্তী সুইফ্ট সংস্করণ (গুলি) তে বৈধ ছিল, মনে হয় এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

12

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

উদাহরণ:

protocol HuhThing {
  var huh: Int { get set }
}

func HuhMaker() -> HuhThing {
   class InnerHuh: HuhThing {
    var innerVal: Int = 0
    var huh: Int {
      get {
        return mysteriousMath(innerVal)
      }

      set {
       innerVal = newValue / 2
      }
    }

    func mysteriousMath(number: Int) -> Int {
      return number * 3 + 2
    }
  }

  return InnerHuh()
}

HuhMaker()
var h = HuhMaker()

h.huh      // 2
h.huh = 32 
h.huh      // 50
h.huh = 39
h.huh      // 59

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

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


ঠিক আছে, আমি এই সমাধান সম্পর্কেও ভেবেছিলাম, তবে আমাকে ব্যাখ্যা কর, কেন আমি h.huh.innerVal দিয়ে অ্যাক্সেস করতে পারি না?
স্যাম

সুইফট টাইপ-সেফ এবং বহিরাগত বিশ্বের এইচ সম্পর্কে একমাত্র জিনিস এটি হুথিংয়ের সাথে সম্মতি জানায়। হুথিং এ ইনারওয়াল নামে পরিচিত কোনও সম্পত্তি সম্পর্কে কোনও তথ্য অন্তর্ভুক্ত করে না এবং তাই এটি অ্যাক্সেস করার চেষ্টা করা একটি ত্রুটি।
ডেভ ক্যাপ

8
এখনও অ্যাক্সেসযোগ্য: পিreflect(h)[0].1.value // 19
জন এস্ট্রোপিয়া

2
জনকে সেখানে খুব ভাল লাগল - আমি প্রতিফলনের বিষয়ে অবগত ছিলাম না। অবজেক্টগুলিকে টুপলেসে পরিণত করার মতো মনে হচ্ছে - সেই ফাংশনে কোনও আনুষ্ঠানিক ডকুমেন্টেশন আছে বা সুইফটে অন্য রূপক উপাদানগুলি আছে? আমি আইবুকগুলিতে ভাষা নির্দেশিকাটি দেখেছি কিন্তু এটি আমি দেখছি না I'm
ডেভ ক্যাপ

1
@ জোহান এস্ট্রোপিয়া আমার মনে হয় না প্রতিফলন গণনা করা। জাভা (আরো ভাষা পরিপক্ক), সেখানে হয় এক্সেস সংশোধনকারীদের, কিন্তু তারা পারেন প্রতিফলন ঠাট বাধাদান করো না।
11684

10

এক্সকোড 6 বিটা 4 হিসাবে, সুইফটে অ্যাক্সেস মডিফায়ার রয়েছে। প্রকাশের নোটগুলি থেকে:

সুইফট অ্যাক্সেস নিয়ন্ত্রণের তিনটি অ্যাক্সেস স্তর রয়েছে:

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

অন্তর্নিহিত ডিফল্টটি হ'ল internalতাই কোনও অ্যাপ্লিকেশন টার্গেটের মধ্যে আপনি যেখানে আরও সীমাবদ্ধ থাকতে চান তা বাদ দিয়ে অ্যাক্সেস মডিফায়ারগুলিকে ছেড়ে দিতে পারেন। একটি কাঠামোর লক্ষ্য (যেমন আপনি যদি কোনও অ্যাপ্লিকেশন এবং একটি ভাগ করে নেওয়ার বা টুডু ভিউ এক্সটেনশনের মধ্যে কোড ভাগ করার জন্য কোনও ফ্রেমওয়ার্ক এম্বেড করছেন), publicআপনার ফ্রেমওয়ার্কের ক্লায়েন্টদের কাছে প্রকাশ করতে চান এমন API এ ডিজাইন করতে ব্যবহার করুন ।


ঠিক আছে, এই উত্তরটি পূর্ববর্তী সুইফ্ট সংস্করণ (গুলি) তে বৈধ ছিল, মনে হয় এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

6

সুইফট 3.0 পাঁচটি পৃথক অ্যাক্সেস নিয়ন্ত্রণ সরবরাহ করে:

  1. খোলা
  2. প্রকাশ্য
  3. অভ্যন্তরীণ
  4. fileprivate
  5. ব্যক্তিগত

ওপেন অ্যাক্সেস এবং সর্বজনীন অ্যাক্সেস সত্তাকে তাদের সংজ্ঞায়িত মডিউল থেকে যে কোনও উত্স ফাইলের মধ্যে ব্যবহার করতে সক্ষম করে এবং সংজ্ঞা মডিউল আমদানি করে এমন অন্য মডিউল থেকে উত্স ফাইলেও সক্ষম করে। কোনও ফ্রেমওয়ার্কে সর্বজনীন ইন্টারফেস নির্দিষ্ট করার সময় আপনি সাধারণত উন্মুক্ত বা সর্বজনীন অ্যাক্সেস ব্যবহার করেন।

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

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

বেসরকারী অ্যাক্সেস বদ্ধ ঘোষণার মধ্যে সত্তার ব্যবহারকে সীমাবদ্ধ করে। কার্যকারিতার নির্দিষ্ট অংশের প্রয়োগের বিশদটি গোপন করতে ব্যক্তিগত অ্যাক্সেস ব্যবহার করুন যখন এই বিবরণগুলি কেবলমাত্র একক ঘোষণার মধ্যে ব্যবহার করা হয়।

উন্মুক্ত অ্যাক্সেস সর্বোচ্চ (সর্বনিম্ন সীমাবদ্ধ) অ্যাক্সেস স্তর এবং ব্যক্তিগত অ্যাক্সেস সর্বনিম্ন (সবচেয়ে সীমাবদ্ধ) অ্যাক্সেস স্তর।

ডিফল্ট অ্যাক্সেস স্তরগুলি

আপনার কোডের সমস্ত সত্তার (কয়েকটি নির্দিষ্ট ব্যতিক্রম সহ) একটি ডিফল্ট অ্যাক্সেস স্তর অভ্যন্তরীণ থাকে যদি আপনি নিজে একটি সুস্পষ্ট অ্যাক্সেস স্তর নির্দিষ্ট না করেন। ফলস্বরূপ, অনেক ক্ষেত্রে আপনাকে আপনার কোডে একটি সুস্পষ্ট অ্যাক্সেস স্তর নির্দিষ্ট করার দরকার নেই।

বিষয়টিতে প্রকাশের নোট:

সর্বজনীন হিসাবে ঘোষিত শ্রেণিগুলি তাদের সংজ্ঞায়িত মডিউলের বাইরে আর সাবক্ল্যাস করা যাবে না এবং জনসাধারণ হিসাবে ঘোষিত পদ্ধতিগুলি তাদের সংজ্ঞায়িত মডিউলের বাইরে আর ওভাররাইড করা যাবে না। কোনও শ্রেণিকে বাহ্যিকভাবে উপশৃঙ্খলাবদ্ধ করার বা কোনও পদ্ধতিকে বাহ্যিকভাবে ওভাররাইড করার অনুমতি দেওয়ার জন্য তাদের উন্মুক্ত হিসাবে ঘোষণা করুন, যা জনসাধারণের বাইরেও একটি নতুন অ্যাক্সেস স্তর। আমদানিকৃত অবজেক্টিভ-সি ক্লাস এবং পদ্ধতিগুলি এখন সর্বজনীন না হয়ে খোলা হিসাবে আমদানি করা হয়। @ টেস্টেবল আমদানি ব্যবহার করে মডিউল আমদানি করা ইউনিট পরীক্ষাগুলি এখনও সর্বজনীন বা অভ্যন্তরীণ ক্লাসের পাশাপাশি সর্বজনীন বা অভ্যন্তরীণ পদ্ধতিগুলিকে ওভাররাইড করার অনুমতি পাবে। (দঃপূঃ-0117)

আরও তথ্য এবং বিশদ: সুইফ্ট প্রোগ্রামিং ভাষা (অ্যাক্সেস নিয়ন্ত্রণ)


ঠিক আছে, এই উত্তরটি পূর্ববর্তী সুইফ্ট সংস্করণ (গুলি) তে বৈধ ছিল, মনে হয় এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

4

বিটা 6-তে, ডকুমেন্টেশনে বলা হয়েছে যে তিনটি পৃথক অ্যাক্সেস মডিফায়ার রয়েছে:

  • প্রকাশ্য
  • অভ্যন্তরীণ
  • ব্যক্তিগত

এবং এই তিনটি ক্লাস, প্রোটোকল, ফাংশন এবং বৈশিষ্ট্যের ক্ষেত্রে প্রযোজ্য।

public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}

আরো জানার জন্য, চেক অ্যাক্সেস কন্ট্রোল


একটি সুরক্ষিত পরিবর্তনকারী হওয়া উচিত যা বৃহত্তর সুরক্ষা সহ ক্লাস তৈরি করতে সহজ করে।
কুমার সি

ঠিক আছে, এই উত্তরটি পূর্ববর্তী সুইফ্ট সংস্করণ (গুলি) তে বৈধ ছিল, মনে হয় এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

2

এখন বিটা 4-এ, তারা সুইফটে অ্যাক্সেস মডিফায়ার যুক্ত করেছে।

থেকে Xcode 6 বিটা 4 realese নোট :

সুইফট অ্যাক্সেস নিয়ন্ত্রণের তিনটি অ্যাক্সেস স্তর রয়েছে:

  • private সত্তা কেবলমাত্র উত্সের মধ্যে থেকে অ্যাক্সেস করা যায়। লে যেখানে তারা ডি-এনড হয়।
  • internal সত্তাগুলি লক্ষ্যমাত্রার মধ্যে যেখানেই সেগুলি ডিএনড করা যায় সেখানে যে কোনও জায়গায় অ্যাক্সেস করা যায়।
  • public লক্ষ্যগুলির মধ্যে যে কোনও জায়গা থেকে এবং বর্তমান টার্গেটের মডিউল আমদানি করা অন্য যে কোনও প্রসঙ্গ থেকে সত্তাগুলি অ্যাক্সেস করা যেতে পারে।

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


আপনি কি এই লিঙ্ক পোস্ট করতে পারেন?
স্নোম্যান

ঠিক আছে, এই উত্তরটি পূর্ববর্তী সুইফ্ট সংস্করণ (গুলি) তে বৈধ ছিল, মনে হয় এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

2

এক্সকোড in তে প্রবর্তিত হিসাবে অ্যাক্সেস নিয়ন্ত্রণ ব্যবস্থা :

আপনার কোডের মধ্যে সত্তর জন্য তিনটি পৃথক অ্যাক্সেস স্তর সরবরাহ করে। এই অ্যাক্সেসের স্তরগুলি উত্স ফাইলের সাথে সম্পর্কিত যা একটি সত্তা সংজ্ঞায়িত করা হয়েছে, এবং উত্স ফাইলটি যে মডিউলটির সাথে সম্পর্কিত।

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

পাবলিক অ্যাক্সেস সর্বোচ্চ (সর্বনিম্ন সীমাবদ্ধ) অ্যাক্সেস স্তর এবং ব্যক্তিগত অ্যাক্সেস সর্বনিম্ন (বা সীমাবদ্ধ) অ্যাক্সেস স্তর।

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

আমার কাছে করা অন্য একটি বিষয়, যা উপরের লিঙ্কটিতে মন্তব্য করা হয়েছে তা হ'ল আপনি অ্যাক্সেস স্তরকে 'আপগ্রেড' করতে পারবেন না। যদি আপনি কোনও কিছু সাবক্লাস করেন তবে আপনি এটিকে আরও সীমাবদ্ধ করতে পারেন তবে অন্যভাবে নয়।

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


ঠিক আছে, এই উত্তরটি পূর্ববর্তী সুইফ্ট সংস্করণ (গুলি) তে বৈধ ছিল, মনে হয় এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

2

ভেরিয়েবল এবং পদ্ধতির অ্যাক্সেসের স্তরের জন্যও সুইফ্ট 3 এবং 4 প্রচুর পরিবর্তন এনেছে। সুইফট 3 এবং 4 এর এখন 4 টির বিভিন্ন অ্যাক্সেস স্তর রয়েছে, যেখানে উন্মুক্ত / সর্বজনীন অ্যাক্সেস সর্বাধিক (সর্বনিম্ন সীমাবদ্ধ) অ্যাক্সেস স্তর এবং ব্যক্তিগত অ্যাক্সেস সর্বনিম্ন (সীমাবদ্ধ) অ্যাক্সেস স্তর:

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

মজাদার:

প্রতিটি একক পদ্ধতি বা সদস্যকে "ব্যক্তিগত" হিসাবে চিহ্নিত করার পরিবর্তে, আপনি কোনও শ্রেণি / কাঠামোর সম্প্রসারণে কিছু পদ্ধতি (উদাহরণস্বরূপ সহায়ক সহায়ক ফাংশন) কভার করতে পারেন এবং পুরো এক্সটেনশানটিকে "ব্যক্তিগত" হিসাবে চিহ্নিত করতে পারেন।

class foo { }

private extension foo {
    func somePrivateHelperFunction01() { }
    func somePrivateHelperFunction02() { }
    func somePrivateHelperFunction03() { }
}

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

অ্যাপল ডকুমেন্টেশন


ঠিক আছে, এই উত্তরটি পূর্ববর্তী সুইফ্ট সংস্করণ (গুলি) তে বৈধ ছিল, মনে হয় এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

2

সুইফট ৩-৩ এর জন্য:

না, এটা সম্ভব নয়। কোনও ব্যক্তিগত / সুরক্ষিত পদ্ধতি এবং ভেরিয়েবল মোটেই নেই।

সবই পাবলিক।

সুইফট 4-এর পরে আপডেট করুন , এই থ্রেডে অন্য উত্তরগুলি পাওয়া সম্ভব


1
এই মন্তব্যটি বর্তমান বীজের জন্য নির্ভুল।
জেস্পার

2
বর্তমান বীজের জন্য। ভবিষ্যতে এটি প্রদর্শিত হবে
জেস্পার

1
"সর্বজনীন" / "সুরক্ষিত" / "ব্যক্তিগত" বর্তমানে বিদ্যমান নেই, তবে আপনি ক্লোজার, প্রোটোকল এবং অভ্যন্তরীণ ক্লাসগুলি ব্যবহার করে জিনিসগুলি আড়াল করতে পারেন - এটি সাধারণত জাভাস্ক্রিপ্টে ব্যবহৃত মডিউল প্যাটার্নের মতো করে তোলে। এটি কীভাবে করবেন তার উদাহরণের জন্য দয়া করে আমার উত্তরটিতে আমার নমুনা কোডটি দেখুন। এটি কীভাবে কাজ করে সে সম্পর্কে যদি আমার ভুল হয় এবং আমার উদাহরণটি ভুল হয় তবে আমি এখনও শিখছি বলে এটি উল্লেখ করুন। :)
ডেভ ক্যাপ

দেখে মনে হচ্ছে এটি আর বৈধ নয় :) দয়া করে আমার উত্তরটি পরীক্ষা করুন ।
আহমদ এফ

1

আপনি যে বিকল্পগুলি ব্যবহার করতে পারেন তার মধ্যে একটি হ'ল উদাহরণস্বরূপ সৃষ্টিটি কোনও ফাংশনে আবৃত করা এবং কোনও কনস্ট্রাক্টরে উপযুক্ত গেটর এবং সেটটার সরবরাহ করা:

class Counter {
    let inc: () -> Int
    let dec: () -> Int

    init(start: Int) {
        var n = start

        inc = { ++n }
        dec = { --n }
    }
}


let c = Counter(start: 10)

c.inc()  // 11
c.inc()  // 12
c.dec()  // 11

0

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


0

যারা সুরক্ষিত পদ্ধতির অনুরূপ কিছু চান তাদের জন্য কিছুটা সময় সাশ্রয় করার আশায়:

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

  1. 'সুরক্ষিত' পদ্ধতি (আসলে ব্যক্তিগত) ধরে রাখতে বেস ক্লাস তৈরি করুন
  2. একই পদ্ধতি ব্যবহার করতে এই শ্রেণীর সাবক্লাস করুন
  3. অন্য ফাইলগুলিতে আপনি বেস ক্লাসের পদ্ধতিগুলি অ্যাক্সেস করতে পারবেন না, এমনকি আপনি যখন সাবক্লাস করেন

উদাহরণস্বরূপ ফাইল 1:

class BaseClass {
    private func protectedMethod() {

    }
}

class SubClass : BaseClass {
    func publicMethod() {
        self.protectedMethod()  //this is ok as they are in same file
    }
}

ফাইল 2:

func test() {
    var a = BaseClass()
    a.protectedMethod() //ERROR


    var b = SubClass()
    b.protectedMethod() //ERROR
}

class SubClass2 : BaseClass {
    func publicMethod() {
        self.protectedMethod() //ERROR
    }

}



-2

সুইফট ২.০ অবধি কেবলমাত্র তিনটি অ্যাক্সেস স্তর ছিল [জনসাধারণ, অভ্যন্তরীণ, ব্যক্তিগত] তবে সুইফটে ৩.০ অ্যাপল দুটি নতুন অ্যাক্সেস স্তর যুক্ত করেছে যা [ওপেন, ফাইল টাইপ] তাই এখন সুইফট ৩.০-তে রয়েছে ৫ টি অ্যাক্সেস স্তর রয়েছে এখানে আমি ভূমিকাটি সাফ করতে চাই এই দুটি অ্যাক্সেস স্তরের 1. টি খুলুন: এটি পাবলিকের সাথে অনেকটা অনুরূপ তবে পার্থক্যটি হ'ল জনসাধারণ সাবক্লাস এবং ওভাররাইড অ্যাক্সেস করতে পারে এবং ওপেন অ্যাক্সেস লেভেল অ্যাক্সেস করতে পারে না যে এই চিত্রটি মিডিয়াম ওয়েবসাইট থেকে নেওয়া হয়েছে এবং এটি পার্থক্য বর্ণনা করে উন্মুক্ত এবং জনসাধারণের অ্যাক্সেসের মধ্যে

এখন দ্বিতীয় নতুন অ্যাক্সেস স্তরের ২. ফাইল টাইপটি অভ্যন্তরের চেয়ে ব্যক্তিগত বা কম অ্যাক্সেস স্তরের বড় সংস্করণ ফাইল টাইপ [শ্রেণি, কাঠামো, এনাম] এর প্রসারিত অংশ অ্যাক্সেস করতে পারে এবং প্রাইভেট কোডের বর্ধিত অংশটি অ্যাক্সেস করতে পারে না এটি কেবল অ্যাক্সেস করতে পারে লেজিক স্কোপটি এই চিত্রটি মিডিয়াম ওয়েবসাইট থেকে নেওয়া হয়েছে এবং এটি ফাইল টাইপ এবং ব্যক্তিগত অ্যাক্সেস স্তরের মধ্যে পার্থক্য বর্ণনা করে

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