Swift 5 - rilis yang ditunggu-tunggu, yang mencakup beberapa lusin perbaikan dan perbaikan. Tetapi tujuan utama dari rilis Swift 5.0 adalah untuk mencapai stabilitas ABI. Pada artikel ini, Anda akan mempelajari apa ABI itu dan apa ABI stabil akan memberi pengembang iOS / macOS. Kami juga akan menganalisis beberapa fitur baru Swift 5.

Stabilitas ABI
ABI adalah antarmuka aplikasi biner. ABI dapat dianggap sebagai seperangkat aturan yang memungkinkan tautan untuk menggabungkan modul komponen yang dikompilasi.
Dengan demikian, berikut ini dijelaskan dalam ABI.
- Kode cara dipanggil dari modul yang berbeda, termasuk yang sistem.
- Format untuk meneruskan argumen dan mendapatkan nilai balik dari fungsi.
- Algoritma tata letak data RAM.
- Manajemen Memori, ARC.
- Ketik sistem, obat generik.
Swift 5, bersama dengan ABI yang stabil, menyediakan kompatibilitas biner untuk aplikasi. Kompatibilitas biner untuk aplikasi iOS / macOS berarti aplikasi yang dikompilasi akan kompatibel dalam runtime dengan pustaka sistem yang dikompilasi oleh versi bahasa yang lebih awal atau lebih baru. Misalnya, aplikasi yang dikompilasi dengan Swift 5.0 akan kompatibel dengan pustaka standar yang dikompilasi dengan Swift 5.1 atau Swift 6.0.
Dimulai dengan iOS 12.2 dan macOS 10.14.4, sistem operasi Apple akan berisi semua yang Anda butuhkan untuk menjalankan aplikasi cepat. Ini berarti bahwa aplikasi yang ditulis dalam Swift 5 dan yang lebih baru tidak akan berisi runtime dan perpustakaan bahasa standar. Karena itu, aplikasi yang ditulis dalam Swift 5 akan memiliki berat sekitar 3-10 megabita lebih sedikit.
Penting untuk dicatat bahwa selain stabilitas ABI, ada juga stabilitas Modul. Jika stabilitas ABI memungkinkan menggabungkan versi berbeda dari runtime dalam runtime, maka stabilitas Modul bertanggung jawab untuk bagaimana kerangka biner yang ditulis dalam versi bahasa yang berbeda dikompilasi. Stabilitas modul akan muncul di Swift 5.1. Dan kemudian pengembang akan dapat mendistribusikan kerangka kerja mereka tidak hanya dengan kode sumber terbuka, tetapi juga dalam bentuk yang dikompilasi.
Kelebihan stabilitas ABI.
- Aplikasi akan lebih sedikit berbobot.
- Mempercepat kinerja startup dan aplikasi.
- Secara teori, Apple bisa menulis kerangka kerja baru sepenuhnya di Swift.
Kontra stabilitas ABI.
Pengembang harus mempertimbangkan kurangnya fungsionalitas baru di versi lama dari perpustakaan standar. Misalnya, jika Swift 5.1 dibangun ke iOS 13 dengan beberapa kelas / fungsi baru di perpustakaan standar, maka dengan dukungan di iOS 12.2, pengembang tidak akan dapat menggunakannya. (Anda harus memasukkan cek #available (...) dengan cara yang sama seperti yang kami lakukan sekarang untuk Foundation, UIKit, dan pustaka platform lainnya).
Jenis hasil di perpustakaan standar
Cara standar untuk mengirim dan menangani kesalahan di API asinkron telah muncul di pustaka standar. Anda juga dapat menggunakan jenis ini jika karena alasan tertentu penanganan kesalahan standar melalui coba / tangkap tidak cocok untuk kami.
Jenis Hasil diimplementasikan melalui enum dengan dua kasus: sukses dan gagal:
public enum Result<Success, Failure> where Failure: Error { case success(Success) case failure(Failure) ... }
Sebenarnya, pendekatan ini bukan hal baru bagi pengembang Swift. Sejak versi pertama Swift, banyak pengembang telah menggunakan pendekatan serupa. Tetapi sekarang, ketika Hasil telah muncul di perpustakaan standar, ini akan menyederhanakan interaksi dengan kode dari perpustakaan eksternal.
Contoh menggunakan layanan unduhan artikel:
struct Article { let title: String } class ArticleService { func fetchArticle(id: Int64, completion: @escaping (Result<Article, Error>) -> Void) {
Dan ini adalah contoh dari pemrosesan hasilnya. Karena Result hanya enum, kita dapat memproses semua statusnya dengan sakelar:
articleService.fetchArticle(id: 42) { result in switch result { case .success(let article): print("Success: \(article)") case .failure(let error): print("Failure: \(error)") } }
String mentah
Dalam Swift 5, mereka menambahkan apa yang disebut string mentah, di mana tanda kutip dan garis miring terbalik ditafsirkan persis sebagai karakter, dan untuk menggunakannya dalam literal, Anda tidak perlu menggunakan karakter escape. Untuk menulis literal untuk string semacam itu, Anda harus menambahkan karakter # ke tanda kutip ganda di tepinya.
Contoh menggunakan kutipan:
Fitur ini sangat berguna saat menulis ekspresi reguler:
Untuk menginterpolasi garis setelah backslash, tambahkan karakter #:
Anda dapat membaca lebih lanjut dalam kalimat ini .
Interpolasi baris yang diperbarui
Menggunakan interpolasi string, kita bisa menambahkan nilai variabel atau hasil ekspresi ke string literal. Dimulai dengan versi bahasa ke-5, menjadi mungkin untuk memperluas cara ekspresi kita ditambahkan ke baris terakhir.
Secara umum, cukup tulis ekstensi ke struktur DefaultStringInterpolation dan tambahkan metode yang disebut appendInterpolation. Misalnya, jika kami ingin menambahkan harga dalam bentuk yang diformat ke string:
extension DefaultStringInterpolation { mutating func appendInterpolation(price: Decimal) { let formatter = NumberFormatter() formatter.numberStyle = .currency if let string = formatter.string(from: price as NSDecimalNumber) { appendLiteral(string) } else { appendLiteral(price.description) } } } print("Price of item: \(price: 9.99)")
Penting untuk dicatat bahwa, pada kenyataannya, konstruksi (harga: 9,99) dalam string menggunakan kompiler diubah menjadi panggilan ke metode appendInterpolasi (harga: Desimal).
Juga dalam metode appendInterpolation kita dapat menambahkan argumen dalam jumlah tidak terbatas, baik yang dinamai maupun yang tidak disebutkan namanya, dengan atau tanpa nilai default.
Anda dapat membaca lebih lanjut dalam kalimat ini .
Memeriksa banyaknya angka
Metode pengecekan multiplicity isMultiple (of :) telah ditambahkan ke tipe numerik di pustaka standar. Ya, kami masih dapat menggunakan operator untuk mengambil sisa pembagian%. Tetapi tampaknya isMultiple (dari :) terlihat lebih visual.
let interger = 42 if interger.isMultiple(of: 3) { print(" ") } else { print(" ") }
Metode CompactMapValues dalam Kamus
Metode compactMapValues memungkinkan Anda untuk mengkonversi nilai kamus, serta memfilternya jika konversi itu sendiri mengembalikan nol.
Misalnya, memetakan kunci string ke jenis URL:
let dict = [ "site": "https://www.site.ru/path/to/web/site/page", "other site": "invalid url" ] let mappedDict: [String: URL] = dict.compactMapValues { URL(string: $0) } print(mappedDict)
Pasangan kunci / nilai kedua dihapus setelah pemetaan, karena string bukan URL yang valid.
Coba ubah perilaku?
Di Swift 4.2 menggunakan coba coba? Anda dapat dengan mudah mendapatkan jenis opsional dengan beberapa tingkat bersarang. Dalam kebanyakan kasus, ini bukan yang diharapkan pengembang. Untuk alasan ini, di Swift 5 coba? mendapat perilaku yang mirip dengan c chaining opsional. Artinya, dengan kombinasi try? dengan rantai opsional atau casting opsional, hasil dari ekspresi akan menjadi opsional dengan satu tingkat sarang.
Coba contohnya? bersama dengan?
Coba contohnya? bersama dengan metode objek opsional:
Anda dapat membaca lebih lanjut dalam kalimat ini .
Atribut @DynamicCallable
Atribut @dynamicCallable yang baru memungkinkan Anda untuk menandai tipe sebagai "callable". Ini berarti bahwa kita dapat memanggil tipe itu sebagai metode normal.
Jika kita menandai tipe sebagai @dynamicCallable, maka kita harus mengimplementasikan satu (atau keduanya) metode:
func dynamicallyCall(withArguments: <#Arguments#>) -> <#R1#> func dynamicallyCall(withKeywordArguments: <#KeywordArguments#>) -> <#R2#>
Tipe argumen harus mendukung protokol ExpressibleByArrayLiteral, tipe KeywordArguments harus mendukung protokol ExpressibleByDictionaryLiteral, dan R1 dan R2 dapat berupa tipe apa pun.
Misalnya, struktur Sum. Ketika Anda memanggilnya, Anda dapat mentransfer sejumlah nomor dan mendapatkan jumlah mereka:
@dynamicCallable struct Sum { func dynamicallyCall(withArguments args: [Int]) -> Int { return args.reduce(0, +) } } let sum = Sum() let result = sum(1, 2, 3, 4) print(result)
Bahkan, kompiler mengubah jumlah (1, 2, 3, 4) menjadi panggilan ke jumlah. Secara sinonim Panggilan (dengan Dokumen: [1, 2, 3, 4]). Demikian pula untuk metode dynamicallyCall (withKeywordArguments :).
Fitur ini memungkinkan Anda untuk menambahkan interaksi kode Swift dengan berbagai bahasa pemrograman dinamis, misalnya, Python atau JavaScript.
Anda dapat membaca lebih lanjut dalam kalimat ini .
Kurangnya dukungan operator dalam versi compiler dan arahan pemeriksaan bahasa
Dimulai dengan versi 5 dari Swift, Anda dapat menggunakan operator “less” ketika memeriksa versi kompiler dalam kode:
Kesimpulan
Ini tidak semua fitur dan peningkatan yang muncul di Swift 5. Secara total, 28 proposal dari komunitas diterima, yang juga termasuk meningkatkan kinerja lini, meningkatkan Manajer Paket Swift, dan perpustakaan standar. Daftar lengkap perubahan dan peningkatan dapat ditemukan di catatan rilis .