Access Control in Swift

by Hoang Anh Tuan
603 views

Content

  1. Giới thiệu về Acess Control
  2. Các loại access control
  3. Subclassing
  4. Getter/Setter
  5. Protocols

Các loại access control

Swift cung cấp 5 loại access control:

Open access:

  • Là loại access có độ truy cập cao nhất.
  • Nếu 1 entity có access level là open, thì nó có thể được truy cập từ bất cứ nơi nào trong module mà thực thể đó được định nghĩa, và cả từ 1 module khác bên ngoài mà đang import module đó.
  • Khi truy cập từ module bên ngoài hoặc bên trong thì đều có thể kế thừa, override,… lại entity đó. > Note: Access level open thường được sử dụng cho các framework, dể bạn có thể dễ dàng kế thừa, override, sử dụng các phương thức của framework đó từ trong project của bạn.

Public access

  • Nếu 1entity có access level là open, thì nó có thể được truy cập từ bất cứ nơi nào trong module mà thực thể đó được định nghĩa, và cả từ 1 module khác bên ngoài mà đang import module đó.
  • Level access thấp hơn open bởi khi truy cập từ module bên ngoài thì không cho phép kế thừa, override,… lại entity đó.

Internal access

  • 1 entity có access level là internal thì sẽ chỉ được sử dụng tại bất cứ nơi nào trong module định nghĩa entity đó, nhưng không thể sử dụng bên ngoài module định nghĩa nó.
  • 1 entity nếu nếu không được set access level cụ thể thì mặc định access level là internal.
name và func printName có access level mặc định là internal.

Fileprivate

  • 1 entity có access level là fileprivate thì sẽ hạn chế quyền truy cập của module định nghĩa tới entity đó. Entity đó chỉ cho phép truy cập tới nó từ bên trong swift file định nghĩa nó.
class A có property name kiểu fileprivate, property age là kiểu internal.

class B không thể truy cập được đến property name của A bởi A và B nằm ở 2 file swift khác nhau và property name có access level là fileprivate.
-> property name chỉ có thể truy cập được trong classA.swift file.

Private

  • Là access level có độ truy cập thấp nhất.
  • 1 entity nếu có access level = private thì sẽ chỉ có thể truy cập được từ class khai báo entity đó, hoặc từ extension của class đó nhưng phải trong cùng 1 swift file. > Bạn nên dùng private access để giấu các phương thức, các biến cụ thể khỏi bên ngoài khi các phương thức, biến đó chỉ được dùng từ bên trong nơi định nghĩa chúng.
classA.swift
 class A {
  private var name = ""
 }
 
 class C {
    let a = A()
 
    func printNameOfA() {
        // Không thể truy cập được property name ở đây vì C 
          không phải class định nghĩa name.
    }
 }
 
 extension A {
     func printName(){
        print(name)
     }
 }
 
 classB.swift
 extension A {
    func printName() {
       // Không thể truy cập được property name ở đây vì extension 
          của A không được khai báo cùng swift file với property name.
    }
 }

Subclassing

  • bạn có thể subclass bất cứ class nào có thể truy cập được trong phạm vi truy cập.
  • 1 subclass thì không thể có access level cao hơn so với super class.
  • Khi override lại các phương thức, class con có thể override lại với 1 access level mới cao hơn so với access level của phương thức của super class.

Getter/Setter

  • Getters và setter mặc định nhận access level của các biến, property,… mà chúng thuộc về.
  • Bạn có thể làm cho setter có access level thấp hơn getter bằng cách cung cấp access level riêng cho setter.
Ở đây. bạn tạo access level private cho property name nên không thể gán 1 giá trị mới cho property name từ bên ngoài class.

Protocols

  • Các func, properties bên trong protocol sẽ chỉ có thẻ có cùng access level cùng với protocol đó.
  • Nếu bạn tạo ra 1 protocol mới kế thừa từ 1 protocol đã có, thì protocol mới phải có access level thấp hơn so với protocol đã có.
  • 1 class có thể conform to 1 protocol có access level thấp hơn class đó.

Hi vọng bài viết đã tổng quát lại được những kiến thức hữu ích về access control trong swift.

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.