Swift 4.0 vs Swift 3.0 - Perbedaan Dan Fitur Baru

Diterbitkan: 2021-10-05

Hari ketika Apple merilis versi baru dari bahasa Swift yang terkenal akhirnya mengejutkan kami. Apa yang harus kita harapkan darinya? Sambil gemetar antisipasi, kami telah memutuskan untuk menyajikan ikhtisar kecil dari pembaruan baru yang akan hadir dalam versi Swift 4 .

3 Landasan Swift.

Sebagai bahasa yang fantastis untuk menulis kode, Swift memiliki kelebihannya sendiri, dan diklaim "lebih lama" dari bahasa Objective-C.

Anda dipersilakan untuk membaca tentang perbedaan utama antara Swift dan Objective-C

Swift cepat , aman untuk mengetik , dan sangat ekspresif . Ini dapat digunakan untuk menulis perangkat lunak di ponsel dan tablet, desktop, dan server - tampaknya, pada semua yang menjalankan kode. Ini menyambut Anda untuk bermain dengannya - dengan aplikasi Swift Playgrounds belajar-cara-kode Apple atau menggunakan Playgrounds di Xcode, Anda dapat langsung melihat hasil pekerjaan Anda, tidak perlu bersusah payah mengembangkan dan menjalankan aplikasi di tempat pertama. Dengan setiap versi aditif baru menjadi lebih baik dan lebih cepat, dan itulah yang terjadi dengan versi Swift 4.
Siap sedia?

Fitur hebat lainnya yang dimiliki Xcode 9 untuk Swift 4 - Anda tidak perlu terlalu khawatir tentang migrasi yang akan datang dan Anda akan mengetahui alasannya saat membaca artikel ini.

Omong-omong, mari kita jelajahi secara singkat apa yang bonbons dan fitur baru Swift 4 yang dibawa musim gugur ini kepada kita.

Mulai

Bahasa itu sendiri tidak terlalu berguna tanpa IDE yang praktis, yaitu Xcode di dunia pengembang . Anda dapat mengunduh Xcode 9 versi terbaru dari Mac App Store atau di halaman Unduhan di situs Pengembang Apple, tetapi pastikan Anda memiliki akun pengembang yang aktif terlebih dahulu. Ini cukup stabil sehingga Anda dapat mengganti Xcode 8 dengannya untuk rutinitas pengkodean harian Anda.

Anda juga dapat menginstal beberapa versi Xcode menggunakan xcversion

Jika Anda memulai proyek baru - Anda siap melakukannya. Tetapi jika Anda sudah memiliki proyek yang ditulis dalam Swift 3.x - Anda harus melalui proses migrasi.

Kami merekomendasikan untuk mencoba terlebih dahulu di Playground - untuk membiasakan diri menggunakan fitur baru.

Anda akan melihat tautan ke proposal Swift Evolution dalam format 'SE-____' saat Anda membaca artikel ini.

Migrasi ke Swift 4

Migrasi dari satu versi utama Swift ke versi berikutnya selalu cukup intens, terutama dari Swift 2.x ke 3.0. Biasanya dibutuhkan sekitar 1-2 hari per proyek, tetapi migrasi ke Swift 4 sedikit lebih mudah dan dapat dilalui lebih cepat.

Persiapan pra-migrasi

Xcode 9 mendukung tidak hanya Swift 4, tetapi juga versi transisi 3.2, jadi proyek Anda harus dikompilasi tanpa kesulitan yang berat. Ini dimungkinkan karena kompiler Swift 4 dan alat migrasi mendukung kedua versi bahasa tersebut. Anda dapat menentukan versi Swift yang berbeda per target, ini sangat membantu jika beberapa perpustakaan pihak ketiga belum memperbarui atau jika Anda memiliki beberapa target dalam proyek Anda. Namun, bukan hanya bahasa, tetapi SDK juga mengalami beberapa perubahan, jadi kemungkinan besar beberapa pembaruan harus diterapkan pada kode Anda karena Apple terus meningkatkan API SDK...

Alat migrasi cepat

Seperti biasa, Apple menyediakan alat migrasi Swift yang dibundel dalam Xcode yang dapat membantu bermigrasi dari versi Swift sebelumnya. Anda dapat meluncurkannya di Xcode dengan masuk ke Edit -> Convert -> To Current Swift Syntax… dan pilih target mana yang ingin Anda konversi.

Anda akan ditanyai preferensi inferensi Objective-C mana yang ingin Anda terapkan:

Karena perubahan aditif mendominasi di Swift 4, alat migrasi Swift akan mengelola sebagian besar perubahan untuk Anda.

CocoaPods

Sebagian besar pengembang menggunakan pengelola ketergantungan CocoaPods untuk proyek mereka karena Pengelola Paket Swift belum matang seperti yang diharapkan, meskipun peningkatannya sangat cepat. Seperti disebutkan di atas, belum semua perpustakaan pihak ketiga diperbarui ke Swift 4, sehingga Anda dapat melihat kesalahan saat mengompilasi beberapa di antaranya. Salah satu solusi yang mungkin untuk memperbaiki masalah ini adalah menentukan Swift versi 3.2 untuk pod yang belum diperbarui dengan menambahkan skrip post_install ke Podfile Anda :

 old_swift_3_pods = [ 'PodName1', 'PodName2', ] post_install do |installer| installer.pods_project.targets.each do |target| if old_swift_3_pods.include? target.name target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = '3.2' end end end end

Lalu lari

 pod install

Sekarang Anda dapat mengkompilasi pod tanpa kesalahan.

Mari kita periksa tentang perubahan dan penambahan Swift 4 API.

Perubahan dan penambahan API

Senar

String sekarang sesuai dengan protokol Collection berkat proposal SE-0163. Ingat Swift 1.x?

Tidak perlu dalam properti array characters sekarang karena Anda dapat mengulangi String secara langsung:

 let string = "Hello, Mind Studios!" for character in string { print(character) }

Ini juga berarti bahwa Anda dapat menggunakan metode dan properti Collection apa pun di String , seperti count , isEmpty , map() , filter() , index(of:) dan banyak lagi:

 string.count // No more `string.characters.count` string.isEmpty // false let index = string.index(of: " ") // 6 let reversedCollection = "abc".reversed() let reversedString = String(reversedCollection) // "cba" // String filtering let string = "ni123n456iniASijasod! 78a9-kasd aosd0" let numbersString = string.filter { Int(String($0)) != nil } // "1234567890"

Jenis Substring baru

Swift 4 menghadirkan tipe Substring baru yang mewakili urutan String (seperti yang dijelaskan dalam SE-0163 yang disebutkan di atas).

 // Split string into substrings let string = "Hello, Mind Studios!" let parts = string.split(separator: " ") // ["Hello,", "Mind", "Studios!"] type(of: parts.first!) // Substring.Type

Baik String dan Substring sekarang mendukung StringProtocol baru yang membuatnya hampir identik dan dapat dioperasikan:

 var hello = parts.first! // Concatenate a String onto a Substring hello += " !" // "Hello, !" // Create a String from a Substring let helloDog = String(hello) // "Hello, !"

Catatan penting

SE-0163 memiliki catatan yang sangat penting:

 Long-term storage of `Substring` instances is discouraged. A substring holds a reference to the entire storage of a larger string, not just to the portion it presents, even after the original string's lifetime ends. Long-term storage of a substring may therefore prolong the lifetime of elements that are no longer otherwise accessible, which can appear to be memory leakage.

Yang berarti Substring dimaksudkan untuk digunakan sebagai penyimpanan sementara untuk String berikutnya. Jika Anda ingin meneruskannya ke beberapa metode atau kelas lain - konversikan ke String terlebih dahulu:

 let substring: Substring = ... // Substring let string = String(substring) // String someMethod(string)

Bagaimanapun, sistem tipe Swift akan membantu Anda untuk tidak melewatkan Substring suatu tempat di mana String diharapkan (dengan asumsi Anda tidak menggunakan StringProtocol baru sebagai tipe parameter).

Literal string multi-baris

SE-0168 memperkenalkan sintaks sederhana untuk literal string multi-baris menggunakan tiga tanda kutip ganda """ yang berarti bahwa sebagian besar format teks (seperti JSON atau HTML) atau beberapa teks panjang dapat ditempelkan tanpa keluar:

 let multilineString = """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam mattis lorem et leo laoreet fermentum. Mauris pretium enim ac mi tempor viverra et fermentum nisl. Sed diam nibh, posuere non lectus at, ornare bibendum erat. Fusce mattis sem ac feugiat vulputate. Morbi at nunc maximus, vestibulum orci et, dictum neque. Vestibulum vulputate augue ac libero vulputate vestibulum. Nullam blandit et sapien non fermentum. Proin mollis nisl at vulputate euismod. """

Melarikan diri dari baris baru dalam literal string

SE-0182 menambahkan kemampuan untuk keluar dari baris baru dalam literal string multi-baris dengan garis miring terbalik di akhir baris.

 let escapedNewline = """ Line 1, Line 2 \ next part of line 2, Line 3 """ print(escapedNewline)
 Line 1, Line 2 next part of line 2, Line 3

Dukungan Unicode yang ditingkatkan

Swift 4 membawa dukungan untuk Unicode 9 yang berarti bahwa masalah dengan penghitungan karakter unicode sekarang hilang:

 "".count // 1, in Swift 3: 2 "".count // 1, in Swift 3: 2 "".count // 1, in Swift 3: 2 - person + skin tone "".count // 1, in Swift 3: 4 "".count // 3, in Swift 3: 1

Semua perubahan dan proposal yang diterapkan yang disorot di atas (seperti banyak lainnya) berakar dari serangkaian fitur yang dijelaskan secara luas yang disebut Manifesto String.

Kontrol akses

Swift 3 membawa elemen yang sangat kontradiktif ke Access control - pengubah akses fileprivate yang bisa sangat membingungkan.
Sebelumnya, pengubah tingkat akses private digunakan untuk menyembunyikan anggota tipe dari tipe lain dan anggota pribadi hanya dapat diakses dengan metode dan properti yang ditentukan pada definisi tipe, mengesampingkan ekstensi tipe yang sama karena mereka tidak dapat mengakses anggota tersebut.
fileprivate dapat digunakan untuk berbagi akses untuk anggota tipe, seperti properti dan metode, dalam file yang sama.
Sebenarnya penggunaan private menyebabkan masalah ketika ekstensi pada beberapa jenis tidak memiliki akses ke anggota jenis itu, jadi menggunakan fileprivate dalam keadaan seperti itu adalah solusi yang sangat umum, yang telah menyebabkan masalah lain: jenis lain di file yang sama dapat mengakses anggota tersebut juga.

Swift 4 mengatur semuanya dengan mengizinkan ekstensi pada tipe untuk mengakses anggota private dari tipe itu dalam file yang sama seperti yang dijelaskan dalam SE-0169:

 struct User { private let firstName: String private let lastName: String } extension User: CustomStringConvertible { var description: String { return "User: \(firstName) \(lastName)" } }

Kamus dan Set

Inisialisasi Dictionary dengan Sequence

Dictionary dapat diinisialisasi dengan Sequence sekarang, tetapi tidak semua urutan dapat dilewatkan dalam penginisialisasi ini, hanya yang berisi tupel (Key, Value) , di mana Key adalah tipe kunci Kamus dan Value mewakili tipe nilai Kamus:

 let stocksIdentifiers = ["AAPL", "GOOGL", "NKE"] let stocksValues = [158.28, 940.13, 53.73] let pairs = zip(stocksIdentifiers, stocksValues) let stocksValuesDict = Dictionary(uniqueKeysWithValues: pairs) // ["GOOGL": 940.13, "NKE": 53.73, "AAPL": 158.28]

Di sini fungsi zip membuat pasangan ( Tuple s) dari 2 urutan, Anda dapat membaca lebih lanjut tentang fungsi ini di dokumentasi Perpustakaan Standar Swift.

Menggabungkan Kamus

Anda dapat menentukan bagaimana kunci duplikat harus ditangani saat membuat kamus dari urutan Tuple s dengan meneruskan penutupan ke parameter uniquingKeysWith , yang digunakan untuk menggabungkan nilai dari 2 kunci identik.

Contoh 1:

 let duplicates = [("a", 1), ("b", 5), ("a", 3), ("b", 3)] let dictionary = Dictionary(duplicates, uniquingKeysWith: { (first, _) in return first }) // ["b": 5, "a": 1]

Di sini kita membiarkan nilai pertama mengabaikan semua nilai berikutnya dengan kunci yang sama.

Contoh 2:

Menghitung berapa kali setiap karakter muncul dalam string.

 let string = "Hello!" let pairs = Array(zip(string, repeatElement(1, count: string.count))) let counts = Dictionary(pairs, uniquingKeysWith: +) // ["H": 1, "e": 1, "o": 1, "l": 2, "!": 1]

Contoh 3:

Menggunakan metode merge :

 let values = ["a": 1, "b": 5] var additionalValues = ["b": 3, "c": 2, "a": 3] additionalValues.merge(values, uniquingKeysWith: +) // ["b": 8, "c": 2, "a": 4]

Subskrip dengan nilai default

Sebelumnya, praktik umum adalah menggunakan operator penggabungan nil untuk memberikan nilai default jika nilainya nihil.

Cepat 3:

 let dict = ["a": 1, "b": 5] dict["c"] ?? 0 // 0

Swift 4 memperkenalkan nilai default baru pada subskrip (bagian dari SE-0165):

 let dict = ["a": 1, "b": 5] dict["c", default: 0] // 0, equals to `dict["c"] ?? 0` in Swift 3

Anda juga dapat mengubah kamus saat membuat subskrip dengan nilai default:

 let string = """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam mattis lorem et leo laoreet fermentum. Mauris pretium enim ac mi tempor viverra et fermentum nisl. Sed diam nibh, posuere non lectus at, ornare bibendum erat. Fusce mattis sem ac feugiat vulputate. Morbi at nunc maximus, vestibulum orci et, dictum neque. Vestibulum vulputate augue ac libero vulputate vestibulum. Nullam blandit et sapien non fermentum. Proin mollis nisl at vulputate euismod. """ var wordsCountByLine = [Int: Int]() let lines = string.split(separator: "\n") for (index, line) in lines.enumerated() { let lineWordsCount = line.split(separator: " ").count wordsCountByLine[index, default: 0] += lineWordsCount } print(wordsCountByLine) // [2: 10, 4: 15, 5: 7, 6: 6, 7: 6, 0: 8, 1: 7, 3: 10]

Peta dan filter khusus kamus

Mengelompokkan elemen urutan

Jenis Terkait yang Dibatasi dalam Protokol

Proposal SE-0142 memperkenalkan penambahan klausa bersyarat ke deklarasi tipe terkait.

 extension Sequence where Element: Numeric { var sum: Element { var result: Element = 0 for element in self { result += element } return result } } [1,2,3,4].sum

Pengarsipan & Serialisasi (Encoding / Decoding)

Sebelumnya, untuk membuat serial beberapa jenis kustom Anda harus menggunakan protokol NSCoding lama dan terkenal. Masalahnya adalah tipe non-kelas seperti struct dan enum tidak dapat menyesuaikan protokol ini, jadi pengembang tidak dapat melakukan apa pun selain menggunakan peretasan seperti memberikan lapisan kompatibilitas tambahan dengan membuat kelas bersarang yang dapat menyesuaikan dengan NSCoding .

Swift 4 memiliki solusi yang sangat nyaman untuk masalah ini berkat SE-0166 - pengenalan protokol Codable :

 struct Employee: Codable { let name: String let age: Int let role: Role enum Role: String, Codable { case manager case developer case admin } } struct Company { let name: String let officeLocation: Location? let employees: [Employee] } struct Location : Codable { let latitude: Double let longitude: Double }

Dalam kasus sederhana seperti ini yang Anda butuhkan hanyalah menambahkan kesesuaian protokol Codable ke semua tipe kustom Anda, kompiler akan melakukan semua keajaiban untuk Anda. Itu dia!

Codable adalah typealias untuk komposisi Decodable & Encodable protokol, sehingga Anda dapat mendeklarasikan, misalnya, hanya Decodable protokol kesesuaian jika Anda ingin membaca sandi jenis contoh Anda dari data JSON.

Pengkodean

Jika Anda ingin membuat serial atau deserialize nilai Codable - Anda harus menggunakan objek dan encoder atau decoder. Swift 4 sudah dilengkapi dengan satu set encoder/decoder untuk JSON dan daftar properti serta CocoaError s baru untuk berbagai jenis kesalahan yang dapat terjadi selama encoding/decoding. NSKeyedArchiver & NSKeyedUnarchiver juga mendukung tipe Codable .

 let employee = Employee(name: "Peter", age: 27, role: .manager) let company = Company(name: "Awesome Company", officeLocation: nil, employees: [employee]) let encoder = JSONEncoder() let companyData = try encoder.encode(company) let string = String(data: companyData, encoding: .utf8)! print(string) >>> { "name" : "Awesome Company", "employees" : [ { "name" : "Peter", "age" : 27, "role" : "manager" } ] }

Sepotong kue, bukan?

Penguraian kode

Decoder digunakan untuk deserialize jenis Codable kustom dari Data . Itu tidak tahu tipe mana yang harus didekode dari data itu sendiri, jadi Anda harus menentukan tipe mana yang akan didekode, misalnya, Employee atau [Employee] :

 let decoder = JSONDecoder() let jsonData = """ [ { "name" : "Peter", "age" : 27, "role" : "manager" }, { "name" : "Alex", "age" : 26, "role" : "developer" }, { "name" : "Eugene", "age" : 30, "role" : "admin" } ] """.data(using: .utf8)! let employees = try decoder.decode([Employee].self, from: jsonData)
 If one of `Codable` type instances fails to decode, then whole collection will fail to decode.

Nama Kunci Kustom

Dalam kebanyakan kasus, nama yang kami gunakan dalam jenis Swift khusus tidak cocok dengan kunci dalam data JSON yang mewakili jenis ini. Untuk membuat pemetaan antara nama properti tipe khusus dan kunci JSON, Anda dapat membuat enum bersarang bernama CodingKeys yang harus sesuai dengan protokol CodingKey :

 struct Country: Decodable { let id: String let name: String let phoneCode: String private enum CodingKeys: String, CodingKey { case id = "alpha3" case name case phoneCode = "phone_code" } }

Dekode Kustom

Jika Anda memiliki kasus yang kompleks, Anda dapat mengimplementasikan penginisialisasi khusus Anda dari protokol yang Dapat Decodable :

 struct Transaction { let id: Int let action: String let source: String let amount: Int let state: TransactionState let createdAt: Date let authorName: String enum TransactionState: String, Decodable { case done case canceled case processed } } extension Transaction: Decodable { private enum CodingKeys: String, CodingKey { case id case action = "action_name" case source = "source_name" case amount case state case createdAt = "created_at" case author } private enum AuthorKeys: String, CodingKey { case fullName = "full_name" } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) id = try container.decode(Int.self, forKey: .id) actionName = try container.decode(String.self, forKey: .action) sourceName = try container.decode(String.self, forKey: .source) let createdAtValue = try container.decode(Double.self, forKey: .createdAt) createdAt = Date(timeIntervalSince1970: createdAtValue) state = try container.decode(TransactionState.self, forKey: .state) amount = try container.decodeIfPresent(Int.self, forKey: .amount) ?? 0 do { let authorContainer = try container.nestedContainer(keyedBy: AuthorKeys.self, forKey: .author) authorName = try authorContainer.decode(String.self, forKey: .fullName) } catch { authorName = "" } } }

Pengkodean Nilai Kunci

Salah satu fitur praktis yang dibawa Swift 4 adalah Smart KeyPaths yang dijelaskan di SE-0161. Tidak seperti Swift 3 #keyPath() , yang tidak diketik dengan kuat dan hanya berfungsi untuk anggota Objective-C, Swift 4 KeyPath adalah kelas generik, yang berarti jalur kunci sekarang diketik dengan kuat. Mari selami beberapa contoh:

 struct User { var username: String }

Bentuk umum dari jalur kunci \<Type>.<path> , di mana <Type> adalah nama tipe, dan <path> adalah rantai dari satu atau lebih properti, misalnya, \User.username :

 let user = User(username: "max") let username = user[keyPath: \User.username] // "max"

Anda juga dapat menulis nilai baru dengan jalur kunci ini jika bisa berubah:

 var user = User(username: "max") user[keyPath: \User.username] = "alex" // "alex"

Jalur kunci tidak terbatas pada satu tingkat hierarki:

 struct Comment { let content: String var author: User } let max = User(username: "max") let comment = Comment(content: "Nice post!", author: max) let authorUsername = comment[keyPath: \Comment.author.username] // "max"

Jalur kunci dapat disimpan dalam variabel:

 let authorKeyPath = \Comment.author let usernameKeyPath = authorKeyPath.appending(path: \.username) let authorUsername = comment[keyPath: usernameKeyPath] // "max"

Anda juga dapat menggunakan jalur kunci untuk properti opsional dan yang dihitung:

 struct Post { let title: String var comments: [Comment] var topComment: Comment? { return comments.first } } let max = User(username: "max") let alex = User(username: "alex") var post = Post(title: "What's new in Swift 4", comments: []) let topCommentAuthorUsernameKeyPath = \Post.topComment?.author.username post[keyPath: topCommentAuthorUsernameKeyPath] // nil let comment = Comment(content: "", author: alex) let anotherComment = Comment(content: "Nice post!", author: max) post.comments = [comment, anotherComment] post[keyPath: topCommentAuthorUsernameKeyPath] // "alex"

Meskipun SE-0161 menyoroti subskrip dukungan di jalur utama, mereka belum diimplementasikan:

 post.comments[keyPath: \.[0].content] // error: key path support for subscript components is not implemented let firstCommentAuthorKeyPath = \Post.comments[0].author // error: key path support for subscript components is not implemented

KVO

Selain jalur kunci baru, API pengamatan nilai kunci telah diperbarui di Swift 4 juga.

 New KVO APIs depend on Objective-C runtime and works for `NSObject` subclasses only, so it can't be used for Swift structs and classes which don't inherit `NSObject`. In order to observe property it should be marked as `@objc dynamic var`.
 class User: NSObject { @objc dynamic var name: String var username: String init(name: String, username: String) { self.name = name self.userName = userName super.init() } } let user = User(name: "Max", username: "max") let nameObservation = user.observe(\.name, options: [.new, .old]) { user, change in // NSKeyValueObservation if let oldValue = change.oldValue, let newValue = change.newValue { print("fullName has changed from \(oldValue) to \(newValue)") } else { print("fullName is now \(user.name)") } } user.name = "Alex" // name has changed from Max to Alex

Panggil metode invalidate() jika Anda ingin menghentikan pengamatan

 nameObservation.invalidate() user.name = "Elina" // observer isn't get called

Itu juga berhenti ketika didefinisikan, jadi pastikan untuk menyimpannya di properti atau di tempat lain jika Anda ingin melestarikannya.

Rentang Satu Sisi

SE-0172 memperkenalkan rentang "satu sisi", dibuat melalui versi awalan/ RangeExpression dari operator rentang yang ada, dan protokol RangeExpression baru untuk menyederhanakan pembuatan metode yang mengambil berbagai jenis rentang.

Urutan Tak Terbatas

Anda dapat menggunakan rentang satu sisi untuk membuat urutan tak terbatas:

 let letters = ["a", "b", "c", "d"] let numberedLetters = Array(zip(1..., letters)) // [(1, "a"), (2, "b"), (3, "c"), (4, "d")]
 let string = "Hello, Mind Studios!" let index = string.index(of: ",")! string[..<index] // "Hello" string[...index] // "Hello,"

Menggunakan Rentang Satu Sisi dalam Pencocokan Pola

 let value = 5 switch value { case 1...: print("greater than zero") case 0: print("zero") case ..<0: print("less than zero") default: break }

Subskrip Umum

SE-0148 Subskrip sekarang dapat memiliki argumen umum dan tipe pengembalian

 struct JSON { let data: [String: Any] subscript<T>(key: String) -> T? { return data[key] as? T } } let jsonDictionary: [String: Any] = [ "name": "Ukraine", "flag": "", "population": 42_500_000 ] let json = JSON(data: jsonDictionary) let population: Int? = json["population"] // 42500600
 extension Dictionary where Value == String { subscript<T: RawRepresentable>(key: Key) -> T? where T.RawValue == Value { guard let string = self[key] else { return nil } return T(rawValue: string) } } enum Color: String { case red case green case blue } let dictionary = [1: "red"] let color: Color? = dictionary[1] // red

Membatasi Inferensi Objective-C

Swift 4 meminimalkan inferensi @objc dengan membatasinya hanya pada kasus-kasus ketika deklarasi harus tersedia untuk Objective-C (SE-0160).
Ini mengurangi ukuran biner aplikasi Anda dengan tidak mengkompilasi kode Objective-C yang berlebihan jika Anda tidak menggunakannya, dan memberikan lebih banyak kontrol kapan @objc akan disimpulkan. Kelas turunan NSObject tidak lagi menyimpulkan @objc.

Tetapi ada beberapa situasi di mana kode Swift akan terus memiliki inferensi implisit:

  • Deklarasi yang memiliki atribut @objc

  • Deklarasi yang memenuhi persyaratan protokol @objc

  • Deklarasi yang memiliki atribut @IBAction, @IBInspectable, @IBOutlet, @NSManaged, @GKInspectable

Untuk mengaktifkan inferensi @objc untuk seluruh kelas, Anda dapat menggunakan atribut @objcmembers yang baru.
Untuk menonaktifkan inferensi @objc untuk ekstensi atau fungsi tertentu - tambahkan atribut @nonobjc baru.

Menyusun Kelas Dan Protokol

Di Swift 4 sekarang kita dapat membuat protokol bersama dengan tipe Swift lainnya:

 User & Codable & CustomStringConvertible typealias MyType = User & Codable & CustomStringConvertible

Manfaat Swift4.

Keuntungan Swift 4 sangat besar, seperti yang sering terjadi ketika Apple merilis versi bahasa baru. Terlepas dari peningkatan kinerja bahasa, itu juga sangat menstabilkan proses migrasi. Memindahkan pikiran kita kembali ke proses migrasi Swift 2.2 ke 3.0, kita mengingat proses yang membingungkan dalam mentransfer semua dependensi. Perubahan Swift 4.0 memungkinkan kami meninggalkan perpustakaan pihak ketiga tanpa benar-benar "merelokasi" mereka - Anda hanya perlu memperbarui Swift sendiri.

Juga mengenai peningkatan Swift 4.0 vs 3.0, ukuran file biner yang dikompilasi telah diubah, yang mengakibatkan penurunan ukuran aplikasi; misal aplikasi mobile yang digunakan beratnya 20 MB, dan pada versi Swift terbaru akan memakan waktu sekitar 17 MB. Dan ada perbedaan mendasar antara Swift 4 dan Swift 3 - perbaikan bug telah terjadi, dan bahasa menjadi sedikit lebih cepat.

Sudah bertahun-tahun sejak Swift digunakan, dan terus berkembang dengan setiap pembaruan yang akan datang. Dengan setiap bahasa baru memperbarui perspektif pengembangan baru, yang tidak diketahui sebelumnya, muncul dan kami berharap dapat menjelajahi cakrawala iOS baru.

Jangan lewatkan artikel kami tentang MVP vs MVC vs MVVM vs VIPER untuk pengembangan iOS.

Ditulis oleh Max Mashkov dan Elina Bessarabova .