Câu trả lời:
assert
là để kiểm tra sự tỉnh táo trong quá trình thử nghiệm, trong khi đó precondition
là để đề phòng những điều, nếu chúng xảy ra, có nghĩa là chương trình của bạn không thể tiến hành một cách hợp lý.
Vì vậy, chẳng hạn, bạn có thể thực assert
hiện một phép tính nào đó có kết quả hợp lý (chẳng hạn như trong một số giới hạn), để nhanh chóng tìm xem bạn có lỗi hay không. Nhưng bạn sẽ không muốn giao hàng với điều đó, vì kết quả ngoài giới hạn có thể hợp lệ và không quan trọng nên sẽ không làm ứng dụng của bạn bị hỏng (giả sử bạn chỉ sử dụng nó để hiển thị tiến trình trong thanh tiến trình).
Mặt khác, kiểm tra xem chỉ số con trên một mảng có hợp lệ khi tìm nạp một phần tử là a precondition
. Không có hành động tiếp theo hợp lý nào để đối tượng mảng thực hiện khi được yêu cầu một chỉ số con không hợp lệ, vì nó phải trả về một giá trị không phải là tùy chọn.
Toàn văn từ tài liệu (thử nhấp vào tùy chọn assert
và precondition
trong Xcode):
Điều kiện tiên quyết
Kiểm tra một điều kiện cần thiết để đạt được tiến bộ.
Sử dụng chức năng này để phát hiện các điều kiện ngăn cản chương trình tiếp tục ngay cả trong mã vận chuyển.
Trong sân chơi và bản dựng -Onone (mặc định cho cấu hình Gỡ lỗi của Xcode): nếu
condition
giá trị là false, hãy dừng thực thi chương trình ở trạng thái có thể gỡ lỗi sau khi inmessage
.Bản dựng In -O (mặc định cho cấu hình Bản phát hành của Xcode): nếu
condition
đánh giá là sai, hãy dừng thực thi chương trình.Các bản dựng In -Ounchecked,
condition
không được đánh giá, nhưng trình tối ưu hóa có thể cho rằng nó sẽ đánh giátrue
. Việc không đáp ứng giả định đó trong các bản dựng -Ounchecked là một lỗi lập trình nghiêm trọng.
Khẳng định
Khẳng định kiểu C truyền thống với một thông báo tùy chọn.
Sử dụng chức năng này để kiểm tra sự tỉnh táo nội bộ đang hoạt động trong quá trình thử nghiệm nhưng không ảnh hưởng đến hiệu suất của mã vận chuyển. Để kiểm tra việc sử dụng không hợp lệ trong các bản phát hành; xem
precondition
.
Trong sân chơi và bản dựng -Onone (mặc định cho cấu hình Gỡ lỗi của Xcode): nếu
condition
giá trị là false, hãy dừng thực thi chương trình ở trạng thái có thể gỡ lỗi sau khi inmessage
.Các bản dựng In -O (mặc định cho cấu hình Bản phát hành của Xcode),
condition
không được đánh giá và không có hiệu ứng.Các bản dựng In -Ounchecked,
condition
không được đánh giá, nhưng trình tối ưu hóa có thể cho rằng nó sẽ đánh giátrue
. Việc không đáp ứng giả định đó trong các bản dựng -Ounchecked là một lỗi lập trình nghiêm trọng.
data["name"]
không tồn tại, nhưng nó nên. Có một xác nhận bên trong bảo vệ..else {} sẽ giúp tôi bắt lỗi bằng cách gặp sự cố và đưa tôi đến vấn đề. Tương tự, nếu mã này đang được sản xuất, xác nhận sẽ không làm hỏng chương trình và bất kỳ mã dự phòng nào mà tôi đã sử dụng ( return nil
) sẽ tiếp quản.
Tôi thấy các khẳng định của Swift - hướng dẫn còn thiếu rất hữu ích
debug release release
function -Onone -O -Ounchecked
assert() YES NO NO
assertionFailure() YES NO NO**
precondition() YES YES NO
preconditionFailure() YES YES YES**
fatalError()* YES YES YES
Và từ các cuộc thảo luận thú vị về Swift Evolution
- khẳng định: kiểm tra mã của riêng bạn để tìm lỗi nội bộ
- điều kiện tiên quyết: để kiểm tra xem khách hàng của bạn đã cung cấp cho bạn các đối số hợp lệ chưa.
Ngoài ra, bạn cần phải cẩn thận về những gì sẽ sử dụng, xem phần khẳng định Mức độ thất bại và Tối ưu hóa
precondition()
và preconditionFailure()
đang có những hành vi tương tự . Sự khác biệt giữa các chức năng này là: precondition
cần một điều kiện bên trong, trong khi preconditionFailure
chỉ cần ném ra ngoài.
Các precondition
hoạt động trong chế độ phát hành, do đó bạn khi bạn gửi ứng dụng của bạn và các điều kiện tiên quyết không ứng dụng sẽ chấm dứt.
Assert
chỉ hoạt động ở chế độ gỡ lỗi như mặc định.
Tôi đã tìm thấy lời giải thích tuyệt vời này khi sử dụng nó trên NSHipster:
Khẳng định là một khái niệm vay mượn từ logic cổ điển. Trong logic, khẳng định là phát biểu về các mệnh đề trong một bằng chứng. Trong lập trình, các xác nhận biểu thị các giả định mà người lập trình đã thực hiện về ứng dụng tại nơi chúng được khai báo.
Khi được sử dụng với khả năng điều kiện trước và điều kiện sau, mô tả kỳ vọng về trạng thái của mã khi bắt đầu và kết thúc thực thi một phương thức hoặc chức năng, các xác nhận tạo thành một hợp đồng. Các xác nhận cũng có thể được sử dụng để thực thi các điều kiện tại thời điểm chạy, nhằm ngăn chặn việc thực thi khi một số điều kiện tiên quyết không thành công.
điều kiện tiên quyết
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Kiểm tra một điều kiện cần thiết để đạt được tiến bộ.
khẳng định
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Khẳng định kiểu C truyền thống với một thông báo tùy chọn.
Sử dụng chức năng này để kiểm tra sự tỉnh táo nội bộ đang hoạt động trong quá trình thử nghiệm nhưng không ảnh hưởng đến hiệu suất của mã vận chuyển. Để kiểm tra việc sử dụng không hợp lệ trong các bản phát hành; xem điều kiện tiên quyết.
Trong các sân chơi và bản dựng -Onone (mặc định cho cấu hình Gỡ lỗi của Xcode): nếu điều kiện đánh giá là sai, hãy dừng thực thi chương trình ở trạng thái có thể gỡ lỗi sau khi in thông báo.