Một số phối cảnh hình ảnh lớn để thêm vào các câu trả lời hữu ích nhưng chi tiết hơn khác:
Trong Swift, dấu chấm than xuất hiện trong một số ngữ cảnh:
- Buộc mở khóa:
let name = nameLabel!.text
- Các tùy chọn không được bao hàm hoàn toàn:
var logo: UIImageView!
- Đúc cưỡng bức:
logo.image = thing as! UIImage
- Các trường hợp ngoại lệ chưa được xử lý:
try! NSJSONSerialization.JSONObjectWithData(data, [])
Mỗi một trong số này là một cấu trúc ngôn ngữ khác nhau với một ý nghĩa khác nhau, nhưng chúng đều có ba điểm quan trọng chung:
1. Dấu chấm than phá vỡ kiểm tra an toàn thời gian biên dịch của Swift.
Khi bạn sử dụng !
trong Swift, bạn là chủ yếu nói, “Này, biên dịch, tôi biết bạn nghĩ rằng một lỗi có thể xảy ra ở đây, nhưng tôi biết với tổng chắc chắn rằng nó sẽ không bao giờ.”
Không phải tất cả các mã hợp lệ đều phù hợp với hộp của hệ thống loại thời gian biên dịch của Swift - hoặc kiểm tra loại tĩnh của bất kỳ ngôn ngữ nào , cho vấn đề đó. Có những tình huống bạn có thể chứng minh một cách hợp lý rằng một lỗi sẽ không bao giờ xảy ra, nhưng bạn không thể chứng minh nó với trình biên dịch . Đó là lý do tại sao các nhà thiết kế của Swift đã thêm các tính năng này ngay từ đầu.
Tuy nhiên, bất cứ khi nào bạn sử dụng !
, bạn đều loại trừ lỗi đường dẫn khôi phục, điều đó có nghĩa là
2. Dấu chấm than là sự cố tiềm ẩn.
Một câu cảm thán cũng nói rằng, Hey Hey Swift, tôi rất chắc chắn rằng lỗi này không bao giờ có thể xảy ra rằng bạn nên đánh sập toàn bộ ứng dụng của mình hơn là để tôi viết mã đường dẫn khôi phục cho nó.
Đó là một khẳng định nguy hiểm. Nó có thể là một câu đúng: trong mã quan trọng trong nhiệm vụ mà bạn đã suy nghĩ kỹ về sự bất biến của mã, có thể là đầu ra không có thật còn tệ hơn một sự cố.
Tuy nhiên, khi tôi nhìn thấy !
ngoài tự nhiên, nó hiếm khi được sử dụng một cách tỉnh táo như vậy. Thay vào đó, điều đó thường có nghĩa là, giá trị này là tùy chọn và tôi thực sự không suy nghĩ quá nhiều về lý do tại sao nó có thể không hoặc làm thế nào để xử lý tình huống đó một cách hợp lý, nhưng việc thêm !
nó đã biên dịch mã sao cho mã của tôi là chính xác, phải không?
Coi chừng sự kiêu ngạo của dấu chấm than. Thay thế…
3. Dấu chấm than được sử dụng tốt nhất một cách tiết kiệm.
Mỗi một trong các !
cấu trúc này có một ?
bản sao buộc bạn phải xử lý trường hợp lỗi / không:
- Unrapping có điều kiện:
if let name = nameLabel?.text { ... }
- Tùy chọn:
var logo: UIImageView?
- Diễn viên có điều kiện:
logo.image = thing as? UIImage
- Trường hợp ngoại lệ không thành công:
try? NSJSONSerialization.JSONObjectWithData(data, [])
Nếu bạn muốn sử dụng !
, luôn luôn tốt để xem xét cẩn thận tại sao bạn không sử dụng ?
thay thế. Là sự cố chương trình của bạn thực sự là lựa chọn tốt nhất nếu !
hoạt động không thành công? Tại sao giá trị đó là tùy chọn / có sẵn?
Có đường dẫn khôi phục hợp lý mà mã của bạn có thể thực hiện trong trường hợp không / lỗi không? Nếu vậy, mã nó.
Nếu nó không thể là con số không, nếu lỗi không bao giờ có thể xảy ra, thì có cách nào hợp lý để làm lại logic của bạn để trình biên dịch biết điều đó không? Nếu vậy, hãy làm điều đó; mã của bạn sẽ ít bị lỗi hơn.
Đôi khi không có cách hợp lý để xử lý lỗi và chỉ cần bỏ qua lỗi - và do đó tiến hành xử lý dữ liệu sai - sẽ tồi tệ hơn so với sự cố. Đó là những lần sử dụng vũ lực tháo gỡ.
Tôi định kỳ tìm kiếm toàn bộ cơ sở mã của mình !
và kiểm tra mỗi lần sử dụng nó. Rất ít tập quán đứng lên để xem xét. (Theo văn bản này, toàn bộ khung Siesta có chính xác hai trường hợp của nó.)
Điều đó không có nghĩa là bạn không bao giờ nên sử dụng !
mã của mình - chỉ là bạn nên sử dụng nó một cách thận trọng và không bao giờ biến nó thành tùy chọn mặc định.