Bài 28: Access control trong swift - Lập trình Swift cơ bản

Đăng bởi: Admin | Lượt xem: 2774 | Chuyên mục: Swift


Định nghĩa

Access control có tính năng hạn chế quyền truy cập vào các phần trong code của bạn từ các đoạn code trong files hay  modules và nó cho phép các chi tiết trong code được ẩn và chỉ định những phần code mà mã đó có thể được truy cập và sử dụng.
Ngoài ra, lập trình viên có thể cho phép, cấp quyền truy cập cho các hàm như class, properties, struct,  initializers hay subscript. Không những thế Swift còn cung cấp giá trị mặc định cho code để giảm sự phức tạp trong việc Access control.

Modules và Source Files

Mỗi module là một đơn vị phân phối code, một ứng dụng mà nó đựng xây dựng, tạo nên như một đơn vị và import vào những module khác với từ khoá 'import' trong Swift.

Access Levels

Có 5 mức độ access khác nhau mà Swift cung cấp, những mức độ access này sẽ có mối tương quan với các file nguồn trong 1 entity đã được xác định sẵn. 

Access Levels

Đây là mức độ cho phép truy cập của các access level. 
Open & public > Internal > File-private > Private
  • Open và public: cho phép function, class,.. có thể truy cập và sử dụng ở bất kỳ file nào. 
open class OpenClass {

    open var aProperty = true // property này có thể được gọi ở mọi file trong module có import module này.

    open func aFunction() {

    }

    public init() {

    }

}
  • Internal access: cho phép các đối tượng có thể được truy cập và sử dụng ở từ bất kỳ 1 file khác trong cùng 1 module Ví dụ:
internal class LoginViewController: UIViewController {

    // property này có thể được gọi ở file khác trong cùng module hiện tại

    internal var aProperty = true 

    // function này có thể được gọi ở file khác trong cùng module hiện tại

    internal func aFunction() { 

    }

}
  • fileprivate access: là 1 access control giới hạn trong 1 file, thường dùng cho extension. Ví dụ:
// SignUpViewController.swift

class SignUpViewController: UIViewController {

    fileprivate var username = ""

    fileprivate var password = ""

    fileprivate func login() {

    }

}
=> các thuộc tính username, password và function login chỉ có thể được gọi đến từ những đoạn code trong file: SignUpViewController.swift thôi.
  • Private access: chỉ cho phép sử dụng trong scope và Swift. Ví dụ:
class Register: UIViewController {

    private var name = ""

    private var email = ""

    private func register() {

    }

}

extension Register {

    private func setup() {

        register() // Đúng. Mặc dù func register() là private nhưng vẫn call được trong extension của nó

    }

}

class OtherClass {

    init() {

        let register = Register()

        register.register() // Sai. func register() đã private không gọi được từ file khác hay class khác.

    }

}
Open access là có quyền truy cập cao nhất và private access có quyền truy cập thấp nhất.

Default Access Levels

Trong một số trường hợp lập trình viên  không cần phải chỉ định access level cho code do tất cả các access level trong từng đoạn code đều được mặc định là internal access. 

Access Levels for Single-Target Apps

Thông thường, đối với 1 app đơn giản, lập trình viên không cần phải code bổ sung thêm ở ngoài module của app nữa. Vì vậy, Access level là internal access là lựa chọn tối ưu cho yêu cầu này, bạn hoàn toàn không cần điều chỉnh nhiều mà app vẫn chạy tốt.

Access Levels for Frameworks

Khi bạn code 1 framework điều đầu tiên bạn cần làm là để open hoặc public. Điều này khiến cho nó có thể truy cập và sử dụng từ những module khác .

Access Control Syntax

Việc duy nhất bạn cần làm để có access control là  thêm access level vào trước chỗ khai báo đối tượng.
Bạn có thể tham khảo ví dụ dưới đây để hiểu hơn nhé.
public class SomePublicClass {}

internal class SomeInternalClass {}

fileprivate class SomeFilePrivateClass {}

private class SomePrivateClass {}

public var somePublicVariable = 0

internal let someInternalConstant = 0

fileprivate func someFilePrivateFunction() {}

private func somePrivateFunction() {}

Trong trường hợp access level là internal (default level). Bạn không cần thêm internal cũng được:

class SomeInternalClass {}              // ngầm hiểu là internal

let someInternalConstant = 0            // ngầm hiểu là internal

 Custom Types

Để chỉ định access level cho 1 custom type thì bắt buộc phải chỉ định nó khi định nghĩa chúng. Access control của 1 type sẽ gây ảnh hưởng đến access level của các property hay methods, initializers, subscripts của type đó. 
Ví dụ như: Nếu bạn định nghĩa 1 class là private thì các đối tượng trong đó cũng là private, Nếu bạn khai báo 1 class là internal hoặc public thì các đối tượng trong đó nếu không chỉ định sẽ được hiểu là internal.
Ví dụ:

Tuple Types

Access level cho tuple được hiểu là mức access hạn chế nhất trong tất cả các loại được sử dụng trong bộ dữ liệu đó. 

Enumeration Types

Các trường hợp của enum sẽ tự động nhận cùng access level với enum mà chúng phụ thuộc chứ bạn không thể chỉ định access level khác cho từng trường hợp của enum.
Trong ví dụ dưới đây: CompassPoint là enum public nên tất cả các case của nó đều có quyền truy cập public:
public enum CompassPoint {

    case north

    case south

    case east

    case west

}

Constants, Variables, Properties, and Subscripts

1 constant, variable, hoặc property không thể có quyền truy cập lớn hơn Type của nó. 
Nếu 1 constant, variable, property hoặc subscript sử dụng Type private thì chúng phải được chỉ định là private private var privateInstance = SomePrivateClass()
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!