سطوح دسترسی در سوییفت

خیلی سریع: سوییفت ۴ دارای ۵ سطح دسترسی مختلف هست.


سطح دسترسی Open

سطح دسترسی Open دارای حداقل محدودیت توی سطوح دسترسی هست. موجودیت‌هایی که با این سطح دسترسی تعریف میشن، خارج از ماژول (module یا target) خودشون می‌تونن مورد استفاده قرار بگیرن و همچنین می‌تونن در هر ماژولی خارج از ماژول خودشون، اصطلاحا Subclass و Override بشن. این همون دلیلی هست که ما وقتی UIKit رو توی اپ خودمون استفاده می‌کنیم، می‌تونیم مثل متدهای UITableView رو Override کنیم.


سطح دسترسی Public

مثل سطح دسترسی Open، این سطح دسترسی هم اجازه استفاده از موجودیت‌ها خارج از ماژول خودشون رو صادر می‌کنن. ولی، بر خلاف Open که اجازه می‌داد خارج از ماژول اصلی، موجودیت‌ها Subclass یا Override بشن، سطح دسترسی Public اجازه میده فقط عملیات Subclass و Override داخل خود ماژول اصلی اتفاق بیوفته.


مقایسه بین Open و Public

// 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 بشه.


سطح دسترسی Internal

موجودیت‌هایی که با این سطح دسترسی تعریف می‌شن، توی کل ماژول (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


سطح دسترسی FilePrivate

این سطح دسترسی استفاده از موجودیت‌ها رو، به فایل کدی (Source File) که موجودیت داخلش تعریف شده محدود می‌کنه.


سطح دسترسی Private

این سطح دسترسی، استفاده از موجودیت‌ها رو به محدوده تعریفش، و همچنین به Extensionهایی که داخل همون فایل کد هستن، محدود می‌کنه.


سطح دسترسی Final

از نسخه ۳ سوییفت، میشه 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 تعریف کنیم.



? برای اطلاعات بیشتر، می‌تونین لینک‌های زیر رو ببینین:

لینک اول: وبلاگ زبان برنامه‌نویسی سوییفت

لینک دوم: مستندات وبسایت اپل


? منبع مطلب: این مطلب رو بر اساس این پست نوشتم.