Swift 5.2 - apa yang baru?

Beta pertama dari Swift 5.2 baru saja muncul di Xcode 11.4 beta, dan telah ada perubahan dalam bahasa, bersama dengan pengurangan dalam ukuran kode dan memori yang digunakan, serta sistem diagnostik baru yang akan memungkinkan Anda untuk dengan cepat mendeteksi kesalahan.

Menggunakan Ekspresi KeyPath sebagai Fungsi


Kami mendefinisikan struktur berikut:

struct User {
    let name: String
    let age: Int
    let bestFriend: String?

    var canVote: Bool {
        age >= 18
    }
}

Mari kita membuat beberapa contoh struktur kita dan meletakkannya dalam array:

let eric = User(name: "Eric Effiong", age: 18, bestFriend: "Otis Milburn")
let maeve = User(name: "Maeve Wiley", age: 19, bestFriend: nil)
let otis = User(name: "Otis Milburn", age: 17, bestFriend: "Eric Effiong")
let users = [eric, maeve, otis]

Sekarang perhatikan: jika Anda perlu mendapatkan array nama semua pengguna, Anda dapat melakukannya sebagai berikut:

let userNames = users.map(\.name)
print(userNames)

Sebelumnya, kami perlu menggunakan penutupan:

let oldUserNames = users.map { $0.name }

Dengan cara baru yang sama, Anda bisa mendapatkan semua pengguna yang dapat memilih:

let voters = users.filter(\.canVote)

Dan di sini kita mendapatkan semua orang yang memiliki sahabat:

let bestFriends = users.compactMap(\.bestFriend)

Nilai untuk tipe yang ditentukan pengguna


Buat struktur Dice dengan properti lowerBound dan upperBound, lalu tambahkan fungsi callAsFunction . Jadi, setiap kali kita mendapatkan nilai dadu, kita akan mendapatkan nilai acak:

struct Dice {
    var lowerBound: Int
    var upperBound: Int

    func callAsFunction() -> Int {
        (lowerBound...upperBound).randomElement()!
    }
}

let d6 = Dice(lowerBound: 1, upperBound: 6)
let roll1 = d6()
print(roll1)

Di sini kita mendapatkan nomor acak dari 1 hingga 6, dan ini benar-benar identik dengan panggilan langsung ke fungsi panggilan (). Kita bisa melakukan hal yang sama seperti ini:

let d12 = Dice(lowerBound: 1, upperBound: 12)
let roll2 = d12.callAsFunction()
print(roll2)

Swift secara otomatis memilih panggilan yang benar berdasarkan pada bagaimana callAsFunction () didefinisikan. Misalnya, Anda dapat menambahkan beberapa parameter, mengubah nilai balik, dan bahkan, jika perlu, menandai metode sebagai bermutasi.

Di sini kita akan membuat struktur StepCounter yang menangkap jumlah langkah yang diambil dan memberi sinyal apakah jumlah langkah yang telah mencapai 10.000:

struct StepCounter {
    var steps = 0

    mutating func callAsFunction(count: Int) -> Bool {
        steps += count
        print(steps)
        return steps > 10_000
    }
}

var steps = StepCounter()
let targetReached = steps(count: 10)

callAsFunction () juga mendukung throw dan rethrows, dan Anda dapat mendefinisikan beberapa metode callAsFunction (), seperti overloading reguler.

Subskrip dapat mendeklarasikan argumen default


Saat menambahkan subskrip ke suatu tipe, Anda bisa menggunakan argumen default. Misalnya, jika kami memiliki struktur PoliceForce dengan subskrip khusus untuk membuat daftar petugas di unit, kami dapat menambahkan parameter default untuk mengembalikannya jika array dibaca di luar perbatasannya:

struct PoliceForce {
    var officers: [String]

    subscript(index: Int, default default: String = "Unknown") -> String {
        if index >= 0 && index < officers.count {
            return officers[index]
        } else {
            return `default`
        }
    }
}

let force = PoliceForce(officers: ["Amy", "Jake", "Rosa", "Terry"])
print(force[0])
print(force[5])

Di sini kita mendapatkan "Amy" dan kemudian "Tidak Dikenal" di output, karena kita tidak memiliki elemen array dengan indeks 5.

Karena kita menulis default default, kita dapat menetapkan nilai kustom, seperti:

print(force[-1, default: "The Vulture"])

Diagnostik baru dan lebih baik


Swift 5.2 memperkenalkan arsitektur diagnostik baru yang tujuannya adalah untuk meningkatkan kualitas dan keakuratan pesan kesalahan pengembangan Xcode. Ini terutama terlihat ketika bekerja dengan kode SwiftUI, di mana Swift sering menghasilkan pesan kesalahan positif palsu.

Sebagai contoh, pertimbangkan kode berikut:

struct ContentView: View {
    @State private var name = 0

    var body: some View {
        VStack {
            Text("What is your name?")
            TextField("Name", text: $name)
                .frame(maxWidth: 300)
        }
    }
}

Di sini kami mencoba mengaitkan tampilan TextField dengan integer Negaraproperti yang salah. Dalam hal ini, Swift 5.1 akan menghasilkan kesalahan karena frame () pengubah 'Int' tidak dapat dikonversi menjadi 'CGFloat?' tetapi Swift 5.2 dan yang lebih baru mengenali kesalahan dalam pengikatan $ name: Tidak dapat mengonversi nilai tipe 'Binding' menjadi argumen yang diharapkan, ketik 'Binding'.

Source: https://habr.com/ru/post/undefined/


All Articles