সুইফট 3-তে ফাইলপ্রাইভেট এবং প্রাইভেটের মধ্যে পার্থক্য করার জন্য একটি ভাল উদাহরণ কী


142

এই নিবন্ধটি নতুন অ্যাক্সেস স্পেসিফায়ারগুলিকে বোঝার ক্ষেত্রে সহায়ক হয়েছে Swift 3। এটি বিভিন্ন ব্যবহারের fileprivateএবং এর কয়েকটি উদাহরণ দেয় private

আমার প্রশ্নটি হচ্ছে - এমন fileprivateকোনও ফাংশন ব্যবহার করছেন না যা কেবল এই ফাইলটিতে ব্যবহার করার মতো হবে private?

উত্তর:


282

fileprivateprivateআগের সুইফ্ট রিলিজে এখন যা ব্যবহৃত হত: একই উত্স ফাইল থেকে অ্যাক্সেসযোগ্য। চিহ্নিত হিসাবে চিহ্নিত ঘোষণাপত্রটি privateকেবলমাত্র ঘোষিত ঘোষণামূলক ক্ষেত্রের মধ্যেই অ্যাক্সেস করা যেতে পারে So সুতরাং এর privateচেয়ে আরও সীমাবদ্ধ fileprivate

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

উদাহরণ (সমস্ত একটি উত্স ফাইলে):

class A {
    private func foo() {}
    fileprivate func bar() {}

    func baz() {
        foo()
        bar()
    }
}

extension A {
    func test() {
        foo() // Swift 3: error: use of unresolved identifier 'foo'
              // Swift 4: no error because extension is in same source file
        bar()
    }
}

let a = A()
a.foo() // error: 'foo' is inaccessible due to 'private' protection level
a.bar()
  • ব্যক্তিগত fooপদ্ধতিটি কেবল class A { ... }সংজ্ঞার পরিধির মধ্যে অ্যাক্সেসযোগ্য । এটি প্রকারের কোনও এক্সটেনশান থেকে অ্যাক্সেসযোগ্যও নয় (সুইফ্ট 3 তে, সুইফ্ট 4-এ পরিবর্তনের জন্য নীচের দ্বিতীয় নোটটি দেখুন)।

  • ফাইল-ব্যক্তিগত barপদ্ধতি একই উত্স ফাইল থেকে অ্যাক্সেসযোগ্য।

মন্তব্য:

  1. প্রস্তাব SE-0159 - স্থির বেসরকারী অ্যাক্সেস স্তরগুলি সুইফট 4-এ সুইফট 2 শব্দার্থে ফিরে যাওয়ার পরামর্শ দেওয়া হয়েছিল সুইফট-বিবর্তন মেলিং তালিকার উপর দীর্ঘ এবং বিতর্কিত আলোচনার পরে, প্রস্তাবটি প্রত্যাখ্যান করা হয়েছিল ।

  2. প্রস্তাব SE-0169 - ব্যক্তিগত ঘোষণা এবং এক্সটেনশনগুলির মধ্যে মিথস্ক্রিয়া উন্নত করেprivate যদি একই উত্স ফাইলে এক্সটেনশানটি সংজ্ঞায়িত করা হয় তবে একই ধরণের এক্সটেনশনে অ্যাক্সেসযোগ্য কোনও ধরনের অভ্যন্তরে ঘোষণা করার পরামর্শ দেয় এই প্রস্তাবটি সুইফট 4-এ গৃহীত হয়েছিল এবং প্রয়োগ করা হয়েছিল।


2
আপনি থেকে 3 সুইফট 2 থেকে স্বয়ংক্রিয়ভাবে কোড রূপান্তর করেন তাহলে, Xcode চালু হবে privateমধ্যে fileprivate। যাইহোক, যদি আপনার হাতে এটি করার বিলাসিতা থাকে তবে আপনি প্রায়শই privateহিসাবে চলে যাওয়ার দ্বারা উপকৃত হতে privateপারেন ... যদি এটি সংকলন করে থাকে তবে সমস্ত ভাল।
ড্যান রোজনস্টার্ক

@ ড্যানিয়েলারসসন: আপনার সম্পাদনা পরামর্শগুলি পুনরায় করুন: উভয় মন্তব্যই foo()কলটিতে প্রযোজ্য ।
মার্টিন আর

82

আমি কেবল প্রাইভেট , ফাইলপ্রাইভেট , খোলা এবং পাবলিক সম্পর্কে একটি চিত্র আঁকছি

আশা করি এটি দ্রুত আপনাকে সহায়তা করতে পারে, পাঠ্যের বিবরণের জন্য দয়া করে মার্টিন আর এর উত্তরটি দেখুন

[সুইফট 4 আপডেট করুন]

এখানে চিত্র বর্ণনা লিখুন


9
দেখুন, fileprivateএক্সটেনশনের সাথে লিঙ্কযুক্ত নয় তবে ফাইলের সাথে (অন্য ফাইলে ক্লাস এ এর ​​এক্সটেনশন লেখার fileprivateসদস্যদের ব্যবহারের অনুমতি দেওয়া হবে না )
ভিন্স

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

প্রকৃতপক্ষে, আমার ডায়াগ্রামটি কেবল একই মডিউলে কাজ করে উল্লেখ করা উচিত, সুতরাং তৃতীয় চিত্রটি আমি কেবল ব্যবহারকারীদের দ্রুত ফাইলপ্রাইভেট বুঝতে চাই কেবল একই ফাইলটিতে কাজ করে।
স্টিফেন চেন

6

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

    class ViewController: UIViewController {
        @IBOutlet var tableView: UITableView!
        //This is not used outside of class Viewcontroller
        private var titleText = "Demo"
        //This gets used in the extension
        fileprivate var list = [String]()
        override func viewDidLoad() {
            navigationItem.title = titleText
        }
    }

    extension ViewController: UITableViewDataSource {
        func numberOfSections(in tableView: UITableView) -> Int {
            return list.count
        }
    }

6

সুইফট ৪.০ এ, ব্যক্তিগত এখন এক্সটেনশনে কিন্তু একই ফাইলের মধ্যে প্রবেশযোগ্য। আপনি যদি অন্য ফাইলটিতে এক্সটেনশন ঘোষণা / সংজ্ঞায়িত করেন তবে আপনার ব্যক্তিগত ভেরিয়েবল আপনার এক্সটেনশনে অ্যাক্সেসযোগ্য হবে না **

ফাইল প্রাইভেট
ফাইল-ব্যক্তিগত অ্যাক্সেস তার নিজস্ব নির্ধারিত উত্স ফাইলটিতে কোনও সত্তার ব্যবহারকে সীমাবদ্ধ করে। যখন নির্দিষ্ট বিবরণগুলি একটি সম্পূর্ণ ফাইলের মধ্যে ব্যবহৃত হয় তখন কার্যকারিতার নির্দিষ্ট অংশের প্রয়োগের বিশদটি গোপন করতে ফাইল-ব্যক্তিগত অ্যাক্সেস ব্যবহার করুন।
সিনট্যাক্স: fileprivate <var type> <variable name>
উদাহরণ: fileprivate class SomeFilePrivateClass {}


প্রাইভেট
বেসরকারী অ্যাক্সেস বদ্ধ ঘোষণার জন্য এবং একই ফাইলটিতে থাকা সেই ঘোষণার এক্সটেনশনের সত্তার ব্যবহারকে সীমাবদ্ধ করে । কার্যকারিতার নির্দিষ্ট অংশের প্রয়োগের বিশদটি গোপন করতে ব্যক্তিগত অ্যাক্সেস ব্যবহার করুন যখন এই বিবরণগুলি কেবলমাত্র একক ঘোষণার মধ্যে ব্যবহার করা হয়।
সিনট্যাক্স: private <var type> <variable name>
উদাহরণ: private class SomePrivateClass {}


সমস্ত অ্যাক্সেস স্তর সম্পর্কে এখানে আরও বিশদ রয়েছে: সুইফট - অ্যাক্সেস স্তরগুলি

এই চিত্রগুলি দেখুন:
ফাইল: ViewController.swift
এখানে এক্সটেনশন এবং দেখুন কন্ট্রোলার উভয়ই একই ফাইলে রয়েছে, তাই ব্যক্তিগত ভেরিয়েবলটি testPrivateAccessLevelএক্সটেনশনে অ্যাক্সেসযোগ্য

এখানে চিত্র বর্ণনা লিখুন


ফাইল: টেস্টফিল.ইউইফ্ট
এখানে এক্সটেনশন এবং দেখুন কন্ট্রোলার উভয়ই বিভিন্ন ফাইলে থাকে, তাই ব্যক্তিগত ভেরিয়েবল testPrivateAccessLevelএক্সটেনশনে অ্যাক্সেসযোগ্য নয়।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


এখানে শ্রেণি ViewController2একটি সাবক্লাস ViewControllerএবং উভয়ই একই ফাইলে। এখানে ব্যক্তিগত ভেরিয়েবল testPrivateAccessLevelসাবক্লাসে অ্যাক্সেসযোগ্য নয় তবে ফাইলপ্রাইভেট সাবক্লাসে অ্যাক্সেসযোগ্য।

এখানে চিত্র বর্ণনা লিখুন


5

যদিও @ মার্টিনআর এবং @ স্টিফেনচেনের উত্তর নিখুঁত, সুইফট 4 জিনিসগুলিকে কিছুটা পরিবর্তন করে।

ব্যক্তিগতকে এখন এমন শ্রেণীর কাছে ব্যক্তিগত হিসাবে বিবেচনা করা হয় যেখানে এটি ঘোষিত হয় এবং এটির সম্প্রসারণেও।

ফাইলপ্রাইভেটটিকে সেই ফাইলটিতে ব্যক্তিগত বলে মনে করা হয় এটি এমন একটি শ্রেণি যেখানে ভেরিয়েবল সংজ্ঞায়িত করা হয়, এটি এক্সটেনশন বা একই ফাইলটিতে সংজ্ঞায়িত অন্য কোনও শ্রেণি হতে পারে।


5

সুইফট 5-এর জন্য আপডেট হয়েছে

ব্যক্তিগত বনাম ফাইলপ্রাইভেট

আরও সুস্পষ্টতার জন্য প্লেগ্রাউন্ডে কোড স্নিপেট পেস্ট করুন

class Sum1 {
    let a: Int!
    let b: Int!
    private var result: Int?
    fileprivate var resultt: Int?

    init(a : Int, b: Int) {
        self.a = a
        self.b = b
    }

    func sum(){
        result = a + b
        print(result as! Int)
    }
}

let aObj = Sum1.init(a: 10, b: 20)
aObj.sum()
aObj.resultt //File Private Accessible as inside same swift file
aObj.result //Private varaible will not be accessible outside its definition except extensions

extension Sum1{

    func testing() {

        // Both private and fileprivate accessible in extensions
        print(result)
        print(resultt)
    }
}

//If SUM2 class is created in same file as Sum1 ---
class Sum2{

    func test(){

        let aSum1 = Sum1.init(a: 2, b: 2)
        // Only file private accessible
        aSum1.resultt

    }
}

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


4

ফাইলপ্রাইভেট - অ্যাক্সেস কন্ট্রোল স্তরটি ফাইলের মধ্যে থাকে।

কেস 1 : আমরা যদি একই বর্গের ফাইলের সাথে এক্সটেনশন তৈরি করি এবং এর প্রসারিততে ফাইলপ্রাইভেট ফাংশন বা ফাইলপ্রাইভেট সম্পত্তি অ্যাক্সেস করার চেষ্টা করি - অ্যাক্সেস অনুমোদিত
কেস 2 : যদি আমরা নতুন ফাইলে ক্লাসের একটি এক্সটেনশন তৈরি করি - এবং এখন ফাইলপ্রাইভেট ফাংশন বা ফাইলপ্রাইভেট অ্যাক্সেস করার চেষ্টা করব সম্পত্তি - অ্যাক্সেস অনুমোদিত নয়

প্রাইভেট - অ্যাক্সেস নিয়ন্ত্রণ স্তরটি লাক্ষিক স্কোপ সহ

কেস 1 : সম্পত্তি বা ফাংশনটি শ্রেণিতে ব্যক্তিগত হিসাবে ঘোষিত হলে - স্কোপটি ডিফল্টরূপে শ্রেণি হয়। কেস 2 : যদি ব্যক্তিগত উদাহরণটি ফাংশন বডি সহ ঘোষণা করা হয় - তবে উদাহরণের সুযোগটি কেবলমাত্র ফাংশন বডিটিতে সীমাবদ্ধ।


3

নিম্নলিখিত উদাহরণে, ভাষা নির্মাণগুলি সংশোধিত করেছে privateএবং fileprivateএকইরকম আচরণ করছে বলে মনে হচ্ছে:

fileprivate func fact(_ n: Int) -> Int {
    if (n == 0) {
        return 1
    } else {
        return n * fact(n - 1)
    }
}

private func gauss(_ n: Int) -> Int {
    if (n == 0) {
        return 0
    } else {
        return n + gauss(n - 1)
    }
}

print(fact(0))
print(fact(5))
print(fact(3))

print(gauss(10))
print(gauss(9))

এটি অনুজ্ঞান অনুসারে, আমার ধারণা। তবে, কি এর ব্যতিক্রম আছে?

বিনম্র শ্রদ্ধা.


3

এটি সুইফট ৪ এর জন্য ব্যাখ্যা sw সুইফ্ট 3 এর জন্য পার্থক্যটি ব্যক্তিগত। সুইট 3 প্রাইভেট এর এক্সটেনশান দ্বারা অ্যাক্সেস করা যাবে না, শুধুমাত্র ক্লাস এ নিজেই অ্যাক্সেস করতে পারে।

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


1
class Privacy {

    fileprivate(set) var pu:Int {
        get {
            return self.pr
        }
        set {
            self.pr = newValue
        }
    }
    private var pr:Int = 0
    fileprivate var fp:Int = 0


    func ex() {
        print("\(self.pu) == \(self.pr) and not \(self.fp)")
    }
}


extension Privacy {

    func ex2() {
        self.pu = 5
        self.ex()
    }

}

আমি এটি পছন্দ করি কারণ এটি ivars এর জন্য অত্যন্ত সহজ।

ফাইলপ্রাইভেটটিকে ব্যক্তিগত (এবং তদ্বিপরীত) এ পরিবর্তন করার চেষ্টা করুন এবং সংকলনে কী ঘটে তা দেখুন ...

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