خیلی سریع: سوییفت ۴ دارای ۵ سطح دسترسی مختلف هست.
سطح دسترسی Open دارای حداقل محدودیت توی سطوح دسترسی هست. موجودیتهایی که با این سطح دسترسی تعریف میشن، خارج از ماژول (module یا target) خودشون میتونن مورد استفاده قرار بگیرن و همچنین میتونن در هر ماژولی خارج از ماژول خودشون، اصطلاحا Subclass و Override بشن. این همون دلیلی هست که ما وقتی UIKit رو توی اپ خودمون استفاده میکنیم، میتونیم مثل متدهای UITableView رو Override کنیم.
مثل سطح دسترسی Open، این سطح دسترسی هم اجازه استفاده از موجودیتها خارج از ماژول خودشون رو صادر میکنن. ولی، بر خلاف Open که اجازه میداد خارج از ماژول اصلی، موجودیتها Subclass یا Override بشن، سطح دسترسی Public اجازه میده فقط عملیات Subclass و Override داخل خود ماژول اصلی اتفاق بیوفته.
// First.framework – A.swift open class A { }
// First.framework – B.swift public class B: A { } // ok
// Second.framework – C.swift import First class C: A {} // ok
// Second.framework – D.swift import First class D: B { } // error: B cannot be subclassed
کلاسی که با Open تعریف شده، توی ماژولهای دیگه میتونه Subclass بشه. همچنین، موجودیتهای کلاس Open میتونه توی ماژولهای دیگه Override هم بشه. در طرف دیگه، کلاسی که با Public تعریف شده، توی ماژولهای دیگه میتونه مورد استفاده قرار بگیره، ولی نمیتونه Subclass و یا Override بشه.
موجودیتهایی که با این سطح دسترسی تعریف میشن، توی کل ماژول (target) خودشون در دسترس هستن، ولی خارج از ماژول خودشون، نه. این رو هم در نظر بگیرین که اگه برای موجودیتها از هیچ سطح دسترسی استفاده نشه، این سطح دسترسی (بعنوان سطح دسترسی پیشفرض) مورد استفاده قرار میگیره.
// First.framework – A.swift internal struct A {} // First.framework – B.swift A() // ok // Second.framework – C.swift import First A() // error: A is unavailable
این سطح دسترسی استفاده از موجودیتها رو، به فایل کدی (Source File) که موجودیت داخلش تعریف شده محدود میکنه.
این سطح دسترسی، استفاده از موجودیتها رو به محدوده تعریفش، و همچنین به Extensionهایی که داخل همون فایل کد هستن، محدود میکنه.
از نسخه ۳ سوییفت، میشه final رو به هر سطح دسترسی اضافه کرد، بجز Open. موجودیتهایی که با استفاده از این کلمه تعریف میشن، (همونطور که از اسمش هم پیداست، نمونه نهایی در نظر گرفته میشن و) اصطلاحا Override و Subclass نمیشن. اینم که برای سطح Open نمیشه از این کلمه استفاده کرد، بخاطر ذات خود Open هست، که برای ایجاد امکان Override و Subclass هست.
سوییفت ۴ با تغییر محدوده دسترسی به موجودیتهای Private، استفاده از fileprivate رو برای Extensionها کاهش داده. قبل از سوییفت ۴، سطح دسترسی private اجازه از موجودیت، داخل Extension رو نمیداد:
class A { private var flag = false }
extension A { func isFlagSet() -> Bool { return flag // Error in Swift 3 // Works fine in Swift 4 } }
توی سوییفت ۳، مشکل این بود که موجودیتهایی که با سطح دسترسی private تعریف میشدن، اجازه دسترسی از طریق Extensionها، حتی اگه توی یک فایل بودن رو هم، نداشتن. راه حل هم این بود که همه اون privateها رو به fileprivate تغییر بدیم. این مشکل توی نسخه ۴ حل شده، و دیگه برای استفاده از موجودیتهای private داخل Extensionها، نیازی نیست اونا رو با fileprivate تعریف کنیم.
? برای اطلاعات بیشتر، میتونین لینکهای زیر رو ببینین:
لینک اول: وبلاگ زبان برنامهنویسی سوییفت
? منبع مطلب: این مطلب رو بر اساس این پست نوشتم.