Trước khi tôi có thể mô tả các trường hợp sử dụng cho Tùy chọn chưa được ẩn hoàn toàn, bạn nên hiểu Tùy chọn nào và Tùy chọn chưa được ẩn hoàn toàn trong Swift. Nếu bạn không, tôi khuyên bạn trước tiên nên đọc bài viết của tôi về các tùy chọn
Khi nào nên sử dụng một tùy chọn hoàn toàn không bị ràng buộc
Có hai lý do chính khiến người ta tạo ra một Tùy chọn hoàn toàn không bị ràng buộc. Tất cả phải làm với việc xác định một biến sẽ không bao giờ được truy cập khi nil
bởi vì nếu không, trình biên dịch Swift sẽ luôn buộc bạn phải mở khóa tùy chọn một cách rõ ràng.
1. Một hằng số không thể được xác định trong quá trình khởi tạo
Mỗi hằng số thành viên phải có một giá trị khi thời gian khởi tạo hoàn tất. Đôi khi, một hằng số không thể được khởi tạo với giá trị chính xác của nó trong quá trình khởi tạo, nhưng nó vẫn có thể được đảm bảo có giá trị trước khi được truy cập.
Việc sử dụng biến Tùy chọn sẽ khắc phục được sự cố này vì Tùy chọn được tự động khởi tạo nil
và giá trị cuối cùng sẽ chứa sẽ không thay đổi. Tuy nhiên, có thể là một nỗi đau khi liên tục mở ra một biến mà bạn biết chắc chắn là không. Các tùy chọn không bị ràng buộc hoàn toàn đạt được các lợi ích giống như một Tùy chọn với lợi ích bổ sung mà người ta không cần phải mở khóa rõ ràng ở mọi nơi.
Một ví dụ tuyệt vời về điều này là khi một biến thành viên không thể được khởi tạo trong lớp con UIView cho đến khi chế độ xem được tải:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
Tại đây, bạn không thể tính chiều rộng ban đầu của nút cho đến khi chế độ xem tải, nhưng bạn biết rằng nó awakeFromNib
sẽ được gọi trước bất kỳ phương thức nào khác trên chế độ xem (ngoài khởi tạo). Thay vì buộc giá trị phải được mở ra một cách rõ ràng một cách vô nghĩa trên tất cả các lớp của bạn, bạn có thể khai báo nó là một Tùy chọn hoàn toàn không bị ràng buộc.
2. Khi ứng dụng của bạn không thể phục hồi từ một biến nil
Điều này cực kỳ hiếm, nhưng nếu ứng dụng của bạn không thể tiếp tục chạy nếu có một biến nil
khi được truy cập, sẽ rất lãng phí thời gian để bận tâm kiểm tra nó nil
. Thông thường nếu bạn có một điều kiện hoàn toàn đúng để ứng dụng của bạn tiếp tục chạy, bạn sẽ sử dụng một assert
. Một tùy chọn hoàn toàn không bị ràng buộc có một khẳng định cho con số không được xây dựng ngay trong nó. Thậm chí sau đó, thường là tốt để mở khóa tùy chọn và sử dụng một xác nhận mô tả nhiều hơn nếu nó là con số không.
Khi không sử dụng một tùy chọn ngầm ẩn
1. Biến thành viên được tính toán nhanh
Đôi khi bạn có một biến thành viên không bao giờ là không, nhưng nó không thể được đặt thành giá trị chính xác trong quá trình khởi tạo. Một giải pháp là sử dụng Tùy chọn chưa được ẩn hoàn toàn, nhưng cách tốt hơn là sử dụng biến lười biếng:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
Bây giờ, biến thành viên contents
không được khởi tạo cho đến khi lần đầu tiên được truy cập. Điều này cho lớp một cơ hội để vào trạng thái chính xác trước khi tính giá trị ban đầu.
Lưu ý: Điều này có vẻ mâu thuẫn với # 1 từ phía trên. Tuy nhiên, có một sự khác biệt quan trọng cần được thực hiện. Ở buttonOriginalWidth
trên phải được đặt trong viewDidLoad để ngăn chặn bất kỳ ai thay đổi độ rộng nút trước khi thuộc tính được truy cập.
2. Ở mọi nơi khác
Đối với hầu hết các phần, nên tránh các tùy chọn không bị che giấu bởi vì nếu sử dụng nhầm, toàn bộ ứng dụng của bạn sẽ bị sập khi được truy cập trong khi nil
. Nếu bạn không bao giờ chắc chắn về việc một biến có thể không, luôn luôn mặc định sử dụng Tùy chọn bình thường. Unwrapping một biến không bao giờ nil
chắc chắn không làm tổn thương nhiều.
if someOptional
.