Apa perbedaan antara precondition(condition: Bool, message: String)
dan assert(condition: Bool, message: String)
di Swift?
Keduanya terlihat sama bagiku. Dalam konteks mana kita harus menggunakan salah satu dari yang lain?
assert
adalah untuk pemeriksaan kewarasan selama pengujian, sedangkan precondition
untuk melindungi dari hal-hal yang, jika terjadi, berarti program Anda tidak dapat dilanjutkan secara wajar.
Jadi misalnya, Anda mungkin menggunakan assert
beberapa kalkulasi yang memiliki hasil yang masuk akal (dalam beberapa batasan, katakanlah), untuk segera menemukan jika Anda memiliki bug. Tetapi Anda tidak ingin mengirimkannya, karena hasil di luar batas mungkin valid, dan tidak kritis sehingga tidak boleh membuat aplikasi Anda mogok (misalkan Anda hanya menggunakannya untuk menampilkan kemajuan dalam bilah kemajuan).
Di sisi lain, memeriksa bahwa subskrip pada array valid saat mengambil elemen adalah a precondition
. Tidak ada tindakan yang masuk akal selanjutnya untuk objek array yang akan diambil ketika diminta untuk subskrip yang tidak valid, karena harus mengembalikan nilai non-opsional.
Teks lengkap dari dokumen (coba mengklik opsi assert
dan precondition
di Xcode):
Prasyarat
Periksa kondisi yang diperlukan untuk membuat kemajuan.
Gunakan fungsi ini untuk mendeteksi kondisi yang harus mencegah program berjalan bahkan dalam kode pengiriman.
Di playgrounds dan build -Onone (default untuk konfigurasi Debug Xcode): jika
condition
bernilai false, hentikan eksekusi program dalam status dapat di-debug setelah pencetakanmessage
.Build dalam -O (default untuk konfigurasi Rilis Xcode): jika
condition
bernilai false, hentikan eksekusi program.Build yang belum diperiksa,
condition
tidak dievaluasi, tetapi pengoptimal mungkin berasumsi bahwa itu akan dievaluasi ketrue
. Kegagalan untuk memenuhi asumsi bahwa dalam build -Ounchecked adalah kesalahan pemrograman yang serius.
Menegaskan
Gaya C tradisional menegaskan dengan pesan opsional.
Gunakan fungsi ini untuk pemeriksaan kesehatan internal yang aktif selama pengujian tetapi tidak memengaruhi performa kode pengiriman. Untuk memeriksa penggunaan yang tidak valid dalam rilis build; lihat
precondition
.
Di playgrounds dan build -Onone (default untuk konfigurasi Debug Xcode): jika
condition
bernilai false, hentikan eksekusi program dalam status dapat di-debug setelah pencetakanmessage
.Build dalam -O (default untuk konfigurasi Rilis Xcode),
condition
tidak dievaluasi, dan tidak ada efek.Build yang belum diperiksa,
condition
tidak dievaluasi, tetapi pengoptimal mungkin berasumsi bahwa itu akan dievaluasi ketrue
. Kegagalan untuk memenuhi asumsi bahwa dalam build -Ounchecked adalah kesalahan pemrograman yang serius.
data["name"]
tidak ada, tetapi seharusnya. Memiliki penegasan di dalam penjaga..else {} akan membantu saya menangkap kesalahan saya dengan menabrak dan membawa saya ke masalah tersebut. Demikian pula, jika kode ini sedang diproduksi, assert tidak akan merusak program, dan kode cadangan apa pun yang saya gunakan (return nil
) akan mengambil alih.Saya menemukan Swift menegaskan - manual yang hilang sangat membantu
Dan dari diskusi menarik tentang Evolusi Swift
Selain itu, Anda harus berhati-hati tentang apa yang harus digunakan, lihat assertionFailure dan Optimization Level
sumber
precondition()
danpreconditionFailure()
yang memiliki perilaku yang sama . Perbedaan antara fungsi tersebut adalah:precondition
butuh kondisi di dalam, sementarapreconditionFailure
hanya membuang.Ini
precondition
aktif dalam mode rilis sehingga Anda saat Anda mengirimkan aplikasi dan prasyaratnya gagal, aplikasi akan dihentikan.Assert
bekerja hanya dalam mode debug sebagai default.Saya menemukan penjelasan yang bagus ini saat menggunakannya di NSHipster:
sumber
Periksa kondisi yang diperlukan untuk membuat kemajuan.
Gaya C tradisional menegaskan dengan pesan opsional.
Gunakan fungsi ini untuk pemeriksaan kesehatan internal yang aktif selama pengujian tetapi tidak memengaruhi performa kode pengiriman. Untuk memeriksa penggunaan yang tidak valid dalam rilis build; lihat prasyarat.
Di playgrounds dan -Onone builds (default untuk konfigurasi Debug Xcode): jika kondisi bernilai false, hentikan eksekusi program dalam status yang dapat di-debug setelah mencetak pesan.
sumber
Hanya ingin menambahkan 2 sen saya. Anda dapat menambahkan pernyataan dalam kode Anda sebanyak yang Anda inginkan. Anda dapat Mengirimkan kode Anda dengan pernyataan ini. Swift TIDAK mengevaluasi blok kode ini untuk aplikasi produksi. Ini hanya dievaluasi dalam mode debug.
Menambahkan tautan dokumentasi
Juga melampirkan gambar dari swift.org
Perhatikan juga, ini tidak terjadi pada prasyarat. Kode yang dikirimkan dengan prasyarat akan mogok dan aplikasi akan dihentikan jika prasyarat tidak dievaluasi sebagai benar.
Singkatnya, pernyataan ditujukan untuk debugging, tetapi dapat dikirimkan tanpa memengaruhi produksi. Pernyataan akan dievaluasi dalam mode debug tetapi tidak dalam produksi.
Dan
PreConditions untuk memastikan hal-hal yang tidak diharapkan tidak terjadi di lingkungan produksi. Kondisi tersebut dievaluasi dan akan menghentikan aplikasi Anda jika dievaluasi sebagai salah
sumber