Bagaimana cara mengatasi kesalahan ini tanpa membuat variabel tambahan?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Saya tidak ingin membuat variabel tambahan hanya untuk menyimpan nilai x. Apakah mungkin untuk melakukan apa yang saya inginkan?
swift
syntax
immutability
mutability
Gabriel
sumber
sumber
Jawaban:
Seperti yang dinyatakan dalam jawaban lain, mulai dari Swift 3 menempatkan var sebelum variabel tidak digunakan lagi. Meskipun tidak dinyatakan dalam jawaban lain adalah kemampuan untuk mendeklarasikan suatu
inout
parameter. Pikirkan: memberikan sebuah pointer.Ini bisa sangat berguna dalam rekursi.
inout
Panduan deklarasi Apple dapat ditemukan di sini .sumber
inout
kata kunci harus ditempatkan di antara nama parameter dan jenis parameter seperti ini:func reduceToZero(x: inout Int)
di versi Swift 3 saat ini.Parameter 'var' tidak digunakan lagi dan akan dihapus di Swift 3. Jadi menetapkan ke parameter baru sepertinya cara terbaik sekarang:
seperti yang disebutkan di sini: Parameter 'var' tidak digunakan lagi dan akan dihapus di Swift 3
sumber
x
di yang baruvar x
? Atau apakah Swift melakukan sesuatu yang lebih efisien dari itu?x
cocok di daftarkan) hampir tidak ada biaya. Jikax
adalah array, struct, atau objek yang dimutasi, maka salinan hampir pasti perlu dilakukan (kecuali pengoptimal dapat menganalisisnya secara inline dan alias).var
args daripada menggunakaninout
yang mungkin memiliki efek samping yang tidak diinginkan, esp. jika var adalah sebuah pointer.Untuk Swift 1 dan 2 (untuk Swift 3 lihat jawaban dengan achi menggunakan parameter masuk): Argumen fungsi di Swift secara
let
default jadi ubah kevar
jika Anda perlu mengubah nilainya, yaitu,sumber
var
dalam parameter sangat mungkin menghilang dalam versi Swift yang lebih baru per github.com/apple/swift-evolution/blob/master/proposals/…Jawaban Swift3 untuk meneruskan pointer array yang bisa berubah.
Fungsi:
Panggilan untuk berfungsi:
sumber
Di Swift Anda cukup menambahkan
var
kata kunci sebelum nama variabel di deklarasi fungsi:Lihat sub-bagian "Parameter Konstan dan Variabel" di bab "Fungsi" di buku Swift (halaman 210 iBook seperti sekarang ini).
sumber
Ada beberapa kasus di mana kami tidak perlu menggunakannya
inout
Kita dapat menggunakan sesuatu seperti ini jika Anda ingin perubahan / cakupan hanya di dalam fungsi:
sumber
Solusi menggunakan Swift5 dengan Pemrograman Fungsional ...
sumber