উত্তর:
fileprivate
private
আগের সুইফ্ট রিলিজে এখন যা ব্যবহৃত হত: একই উত্স ফাইল থেকে অ্যাক্সেসযোগ্য। চিহ্নিত হিসাবে চিহ্নিত ঘোষণাপত্রটি 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
পদ্ধতি একই উত্স ফাইল থেকে অ্যাক্সেসযোগ্য।
মন্তব্য:
প্রস্তাব SE-0159 - স্থির বেসরকারী অ্যাক্সেস স্তরগুলি সুইফট 4-এ সুইফট 2 শব্দার্থে ফিরে যাওয়ার পরামর্শ দেওয়া হয়েছিল সুইফট-বিবর্তন মেলিং তালিকার উপর দীর্ঘ এবং বিতর্কিত আলোচনার পরে, প্রস্তাবটি প্রত্যাখ্যান করা হয়েছিল ।
প্রস্তাব SE-0169 - ব্যক্তিগত ঘোষণা এবং এক্সটেনশনগুলির মধ্যে মিথস্ক্রিয়া উন্নত করেprivate
যদি একই উত্স ফাইলে এক্সটেনশানটি সংজ্ঞায়িত করা হয় তবে একই ধরণের এক্সটেনশনে অ্যাক্সেসযোগ্য কোনও ধরনের অভ্যন্তরে ঘোষণা করার পরামর্শ দেয় ।
এই প্রস্তাবটি সুইফট 4-এ গৃহীত হয়েছিল এবং প্রয়োগ করা হয়েছিল।
foo()
কলটিতে প্রযোজ্য ।
আমি কেবল প্রাইভেট , ফাইলপ্রাইভেট , খোলা এবং পাবলিক সম্পর্কে একটি চিত্র আঁকছি
আশা করি এটি দ্রুত আপনাকে সহায়তা করতে পারে, পাঠ্যের বিবরণের জন্য দয়া করে মার্টিন আর এর উত্তরটি দেখুন
[সুইফট 4 আপডেট করুন]
fileprivate
এক্সটেনশনের সাথে লিঙ্কযুক্ত নয় তবে ফাইলের সাথে (অন্য ফাইলে ক্লাস এ এর এক্সটেনশন লেখার fileprivate
সদস্যদের ব্যবহারের অনুমতি দেওয়া হবে না )
public
আপনাকে উত্তরাধিকার সূত্রে অনুমতি দেবে না, তাই তৃতীয় চিত্রটি ভুল। এছাড়াও, আপনি যদি সর্বদা এটি দেখতে পারেন তবে যে কোনও শ্রেণিতে একটি এক্সটেনশন রাখতে পারেন put এক্সটেনশনে দৃশ্যমানতা ব্যাখ্যা করা তখন খুব ভাল ধারণা নয়।
থাম্বের ব্যবহারিক নিয়ম হ'ল আপনি ভেরিয়েবল, কনস্ট্যান্টস, অভ্যন্তরীণ স্ট্রাক্ট এবং ক্লাসগুলির জন্য ব্যক্তিগত ব্যবহার করেন যা কেবলমাত্র আপনার শ্রেণি / কাঠামোর ঘোষণার অভ্যন্তরে ব্যবহৃত হয়। আপনি আপনার শ্রেণিবদ্ধ / কাঠামোর মতো একই ফাইলের মধ্যে আপনার এক্সটেনশনের অভ্যন্তরে ব্যবহৃত জিনিসগুলির জন্য ফাইলপ্রাইভেট ব্যবহার করেন তবে তাদের সংজ্ঞায়িত কোঁকড়া ধনুর্বন্ধনী (যেমন তাদের লাক্ষিক ক্ষেত্র) এর বাইরে।
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
}
}
সুইফট ৪.০ এ, ব্যক্তিগত এখন এক্সটেনশনে কিন্তু একই ফাইলের মধ্যে প্রবেশযোগ্য। আপনি যদি অন্য ফাইলটিতে এক্সটেনশন ঘোষণা / সংজ্ঞায়িত করেন তবে আপনার ব্যক্তিগত ভেরিয়েবল আপনার এক্সটেনশনে অ্যাক্সেসযোগ্য হবে না **
ফাইল প্রাইভেট
ফাইল-ব্যক্তিগত অ্যাক্সেস তার নিজস্ব নির্ধারিত উত্স ফাইলটিতে কোনও সত্তার ব্যবহারকে সীমাবদ্ধ করে। যখন নির্দিষ্ট বিবরণগুলি একটি সম্পূর্ণ ফাইলের মধ্যে ব্যবহৃত হয় তখন কার্যকারিতার নির্দিষ্ট অংশের প্রয়োগের বিশদটি গোপন করতে ফাইল-ব্যক্তিগত অ্যাক্সেস ব্যবহার করুন।
সিনট্যাক্স: fileprivate <var type> <variable name>
উদাহরণ: fileprivate class SomeFilePrivateClass {}
প্রাইভেট
বেসরকারী অ্যাক্সেস বদ্ধ ঘোষণার জন্য এবং একই ফাইলটিতে থাকা সেই ঘোষণার এক্সটেনশনের সত্তার ব্যবহারকে সীমাবদ্ধ করে । কার্যকারিতার নির্দিষ্ট অংশের প্রয়োগের বিশদটি গোপন করতে ব্যক্তিগত অ্যাক্সেস ব্যবহার করুন যখন এই বিবরণগুলি কেবলমাত্র একক ঘোষণার মধ্যে ব্যবহার করা হয়।
সিনট্যাক্স: private <var type> <variable name>
উদাহরণ: private class SomePrivateClass {}
সমস্ত অ্যাক্সেস স্তর সম্পর্কে এখানে আরও বিশদ রয়েছে: সুইফট - অ্যাক্সেস স্তরগুলি
এই চিত্রগুলি দেখুন:
ফাইল: ViewController.swift
এখানে এক্সটেনশন এবং দেখুন কন্ট্রোলার উভয়ই একই ফাইলে রয়েছে, তাই ব্যক্তিগত ভেরিয়েবলটি testPrivateAccessLevel
এক্সটেনশনে অ্যাক্সেসযোগ্য
ফাইল: টেস্টফিল.ইউইফ্ট
এখানে এক্সটেনশন এবং দেখুন কন্ট্রোলার উভয়ই বিভিন্ন ফাইলে থাকে, তাই ব্যক্তিগত ভেরিয়েবল testPrivateAccessLevel
এক্সটেনশনে অ্যাক্সেসযোগ্য নয়।
এখানে শ্রেণি ViewController2
একটি সাবক্লাস ViewController
এবং উভয়ই একই ফাইলে। এখানে ব্যক্তিগত ভেরিয়েবল testPrivateAccessLevel
সাবক্লাসে অ্যাক্সেসযোগ্য নয় তবে ফাইলপ্রাইভেট সাবক্লাসে অ্যাক্সেসযোগ্য।
যদিও @ মার্টিনআর এবং @ স্টিফেনচেনের উত্তর নিখুঁত, সুইফট 4 জিনিসগুলিকে কিছুটা পরিবর্তন করে।
ব্যক্তিগতকে এখন এমন শ্রেণীর কাছে ব্যক্তিগত হিসাবে বিবেচনা করা হয় যেখানে এটি ঘোষিত হয় এবং এটির সম্প্রসারণেও।
ফাইলপ্রাইভেটটিকে সেই ফাইলটিতে ব্যক্তিগত বলে মনে করা হয় এটি এমন একটি শ্রেণি যেখানে ভেরিয়েবল সংজ্ঞায়িত করা হয়, এটি এক্সটেনশন বা একই ফাইলটিতে সংজ্ঞায়িত অন্য কোনও শ্রেণি হতে পারে।
সুইফট 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
}
}
দ্রষ্টব্য : সুইফট ফাইলের বাইরে ব্যক্তিগত এবং ফাইলপ্রাইভেট উভয়ই অ্যাক্সেসযোগ্য নয়।
ফাইলপ্রাইভেট - অ্যাক্সেস কন্ট্রোল স্তরটি ফাইলের মধ্যে থাকে।
কেস 1 : আমরা যদি একই বর্গের ফাইলের সাথে এক্সটেনশন তৈরি করি এবং এর প্রসারিততে ফাইলপ্রাইভেট ফাংশন বা ফাইলপ্রাইভেট সম্পত্তি অ্যাক্সেস করার চেষ্টা করি - অ্যাক্সেস অনুমোদিত
কেস 2 : যদি আমরা নতুন ফাইলে ক্লাসের একটি এক্সটেনশন তৈরি করি - এবং এখন ফাইলপ্রাইভেট ফাংশন বা ফাইলপ্রাইভেট অ্যাক্সেস করার চেষ্টা করব সম্পত্তি - অ্যাক্সেস অনুমোদিত নয়
প্রাইভেট - অ্যাক্সেস নিয়ন্ত্রণ স্তরটি লাক্ষিক স্কোপ সহ
কেস 1 : সম্পত্তি বা ফাংশনটি শ্রেণিতে ব্যক্তিগত হিসাবে ঘোষিত হলে - স্কোপটি ডিফল্টরূপে শ্রেণি হয়। কেস 2 : যদি ব্যক্তিগত উদাহরণটি ফাংশন বডি সহ ঘোষণা করা হয় - তবে উদাহরণের সুযোগটি কেবলমাত্র ফাংশন বডিটিতে সীমাবদ্ধ।
নিম্নলিখিত উদাহরণে, ভাষা নির্মাণগুলি সংশোধিত করেছে 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))
এটি অনুজ্ঞান অনুসারে, আমার ধারণা। তবে, কি এর ব্যতিক্রম আছে?
বিনম্র শ্রদ্ধা.
এটি সুইফট ৪ এর জন্য ব্যাখ্যা sw সুইফ্ট 3 এর জন্য পার্থক্যটি ব্যক্তিগত। সুইট 3 প্রাইভেট এর এক্সটেনশান দ্বারা অ্যাক্সেস করা যাবে না, শুধুমাত্র ক্লাস এ নিজেই অ্যাক্সেস করতে পারে।
সুইফ্ট 4 এর পরে ফাইলপ্রাইভেটটি কিছুটা রিডানডান্ট হয়ে যায়, কারণ ব্যক্তি সাধারণত একই ফাইলটিতে সাবক্লাসটি সংজ্ঞায়িত করবে না। ব্যক্তিগত ক্ষেত্রে বেশিরভাগ ক্ষেত্রে পর্যাপ্ত পরিমাণে হওয়া উচিত।
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 এর জন্য অত্যন্ত সহজ।
ফাইলপ্রাইভেটটিকে ব্যক্তিগত (এবং তদ্বিপরীত) এ পরিবর্তন করার চেষ্টা করুন এবং সংকলনে কী ঘটে তা দেখুন ...
private
মধ্যেfileprivate
। যাইহোক, যদি আপনার হাতে এটি করার বিলাসিতা থাকে তবে আপনি প্রায়শইprivate
হিসাবে চলে যাওয়ার দ্বারা উপকৃত হতেprivate
পারেন ... যদি এটি সংকলন করে থাকে তবে সমস্ত ভাল।