as
được sử dụng để dự báo và truyền kiểu sang kiểu bắc cầu
as?
được sử dụng để truyền an toàn, trả về nil nếu không thành công
as!
được sử dụng để ép đúc, sụp đổ nếu không thành công
Ghi chú:
as!
không thể truyền loại thô thành tùy chọn
Ví dụ:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
Thí dụ
var age: Int? = nil
var height: Int? = 180
Bằng cách thêm một ? ngay sau kiểu dữ liệu, bạn cho trình biên dịch biết rằng biến đó có thể chứa một số hoặc không. Khéo léo! Lưu ý rằng không thực sự có ý nghĩa khi xác định các hằng số Tùy chọn - bạn chỉ có thể đặt giá trị của chúng một lần và do đó bạn có thể nói liệu giá trị của chúng có bằng không hay không.
Khi nào chúng ta nên sử dụng "?" và khi "!"
giả sử chúng tôi có ứng dụng đơn giản dựa trên UIKit. chúng tôi có một số mã trong bộ điều khiển chế độ xem của mình và muốn trình bày bộ điều khiển chế độ xem mới ở trên nó. và chúng tôi cần quyết định đẩy chế độ xem mới trên màn hình bằng bộ điều khiển điều hướng.
Như chúng ta biết mọi cá thể ViewController đều có bộ điều khiển điều hướng thuộc tính. Nếu bạn đang xây dựng ứng dụng dựa trên bộ điều khiển điều hướng, thuộc tính này của bộ điều khiển chế độ xem chính của ứng dụng được đặt tự động và bạn có thể sử dụng nó để đẩy hoặc bật bộ điều khiển chế độ xem. Nếu bạn sử dụng một mẫu dự án ứng dụng duy nhất - sẽ không có bộ điều khiển điều hướng được tạo tự động cho bạn, vì vậy bộ điều khiển chế độ xem mặc định của ứng dụng sẽ không có bất kỳ thứ gì được lưu trữ trong thuộc tính navigationController.
Tôi chắc rằng bạn đã đoán rằng đây chính xác là một trường hợp cho một kiểu dữ liệu Tùy chọn. Nếu bạn kiểm tra UIViewController, bạn sẽ thấy rằng thuộc tính được định nghĩa là:
var navigationController: UINavigationController? { get }
Vì vậy, hãy quay lại trường hợp sử dụng của chúng ta. Nếu bạn biết thực tế rằng bộ điều khiển chế độ xem của mình sẽ luôn có bộ điều khiển điều hướng, bạn có thể tiếp tục và buộc mở nó ra:
controller.navigationController!.pushViewController(myViewController, animated: true)
Khi bạn đặt một! đằng sau tên thuộc tính mà bạn nói với trình biên dịch Tôi không quan tâm rằng thuộc tính này là tùy chọn, tôi biết rằng khi mã này thực thi sẽ luôn có một kho lưu trữ giá trị vì vậy hãy coi tùy chọn này như một kiểu dữ liệu bình thường. Điều đó không tốt sao? Điều gì sẽ xảy ra nếu không có bộ điều khiển điều hướng cho bộ điều khiển chế độ xem của bạn? Nếu bạn đề xuất rằng sẽ luôn có một giá trị được lưu trữ trong navigationController là sai? Ứng dụng của bạn sẽ gặp sự cố. Đơn giản và xấu xí như vậy.
Vì vậy, hãy sử dụng! chỉ khi bạn chắc chắn 101% rằng điều này là an toàn.
Còn nếu bạn không chắc chắn rằng sẽ luôn có một bộ điều khiển điều hướng? Sau đó, bạn có thể sử dụng? Thay vì một !:
controller.navigationController?.pushViewController(myViewController, animated: true)
Cái gì ? đằng sau tên thuộc tính cho trình biên dịch biết là tôi không biết thuộc tính này chứa nil hay một giá trị, vì vậy: nếu nó có giá trị, hãy sử dụng nó, và ngược lại chỉ cần xem xét toàn bộ biểu thức nil. Hiệu quả? cho phép bạn sử dụng thuộc tính đó chỉ trong trường hợp có bộ điều khiển điều hướng. Không nếu séc của bất kỳ loại nào hoặc đúc dưới bất kỳ hình thức nào. Cú pháp này là hoàn hảo khi bạn không quan tâm đến việc bạn có bộ điều khiển điều hướng hay không và chỉ muốn làm điều gì đó nếu có.
Rất cảm ơn Fantageek