Swift 4.0 vs Swift 3.0 - Perbedaan Dan Fitur Baru
Diterbitkan: 2021-10-05Hari 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 .