Nội dung
Đị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()