Baiklah jadi saya baru saja memperbarui Xcode ke 7.3 dan sekarang saya mendapatkan peringatan ini:
Parameter 'var' tidak digunakan lagi dan akan dihapus di Swift 3
Cara memperbaikinya ketika saya perlu menggunakan var dalam fungsi ini:
public func getQuestionList(var language: String) -> NSArray {
if self.data.count > 0 {
if (language.isEmpty) {
language = "NL"
}
return self.data.objectForKey("questionList" + language) as! NSArray
}
return NSArray()
}
public func getQuestionList(inout language: String) -> NSArray
getQuestion
ada efek samping.func foo(_ bar: int) { /*use bar*/ bar+=1; foo(bar); }
. Ini tidak mungkin tanpa var params. Anda juga perlu membuat var terpisah di dalam fungsi dan menyalin nilainya, atau menandai param sebagai inout. Yang pertama lambat, yang terakhir menyebabkan perilaku yang tidak terdefinisi. Banyak algoritme menggunakan rekursi seperti ini.Jawaban:
Sudahkah Anda mencoba menetapkan ke var baru
sumber
Diskusi tentang penghapusan Var dari parameter fungsi sepenuhnya didokumentasikan dalam kiriman ini di GitHub: Hapus Parameter Var
Dalam dokumen tersebut Anda akan menemukan bahwa orang sering mengacaukan
var
parameter denganinout
parameter. Sebuahvar
parameter hanya berarti bahwa parameter bisa berubah dalam konteks fungsi, sedangkan denganinout
parameter nilai parameter pada titik pengembalian akan disalin dari fungsi dan dalam konteks pemanggil.Cara yang benar untuk mengatasi masalah ini adalah dengan menghapus
var
parameter dan memasukkanvar
variabel lokal . Di bagian atas rutin, salin nilai parameter ke variabel itu.sumber
Cukup tambahkan satu baris ini di awal fungsi:
dan kode Anda lainnya tidak akan berubah, seperti ini:
sumber
Banyak orang menyarankan
inout
parameter, tetapi sebenarnya bukan itu yang mereka rancang. Selain itu, itu tidak memungkinkan pemanggilan fungsi denganlet
konstanta, atau dengan string literal. Mengapa Anda tidak menambahkan nilai default ke tanda tangan fungsi?Pastikan untuk tidak memanggil
getQuestionList
dengan string kosong jika Anda menginginkan bahasa default, tetapi biarkan parameternya:sumber
Cepat 4
Dalam beberapa kasus, seperti yang saya alami (dengan pengaturan yang lebih kompleks yang melibatkan array), membuat properti baru di dalam metode dan mengubah properti itu mungkin tidak selalu berfungsi. Belum lagi, Anda mengacaukan metode alih-alih hanya menambahkan
inout
ke parameter dan&
argumennya, yang untuk tujuan sintaks ini dibuat.sumber
}
sumber
Menurut saya jawaban @Harris dan @garanda adalah pendekatan terbaik.
Bagaimanapun, dalam kasus Anda, var tidak diperlukan, Anda dapat melakukan:
sumber
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html
Parameter Masuk-Keluar
Parameter fungsi adalah konstanta secara default. Mencoba mengubah nilai parameter fungsi dari dalam tubuh fungsi itu menghasilkan kesalahan waktu kompilasi. Ini berarti Anda tidak dapat mengubah nilai parameter secara tidak sengaja. Jika Anda ingin sebuah fungsi mengubah nilai parameter, dan Anda ingin perubahan tersebut tetap ada setelah panggilan fungsi berakhir, tetapkan parameter itu sebagai parameter masuk-keluar.
Anda menulis parameter masuk-keluar dengan menempatkan kata kunci masuk tepat sebelum jenis parameter. Parameter masuk-keluar memiliki nilai yang diteruskan ke fungsi, dimodifikasi oleh fungsi, dan dikirim keluar fungsi untuk menggantikan nilai asli. Untuk pembahasan mendetail tentang perilaku parameter masuk-keluar dan pengoptimalan compiler terkait, lihat Parameter Masuk-Keluar.
Anda hanya dapat mengirimkan variabel sebagai argumen untuk parameter masuk-keluar. Anda tidak dapat meneruskan konstanta atau nilai literal sebagai argumen, karena konstanta dan literal tidak dapat diubah. Anda menempatkan ampersand (&) tepat sebelum nama variabel ketika Anda meneruskannya sebagai argumen ke parameter masuk-keluar, untuk menunjukkan bahwa itu dapat dimodifikasi oleh fungsi.
CATATAN
Parameter masuk-keluar tidak boleh memiliki nilai default, dan parameter variadic tidak dapat ditandai sebagai masuk.
Berikut adalah contoh fungsi yang disebut swapTwoInts ( : :), yang memiliki dua parameter bilangan bulat masuk-keluar yang disebut a dan b:
The swapTwoInts ( : :) hanya menukar nilai b menjadi a, dan nilai a menjadi b. Fungsi melakukan pertukaran ini dengan menyimpan nilai a dalam konstanta sementara yang disebut temporaryA, menetapkan nilai b ke a, dan kemudian menetapkan sementaraA ke b.
Anda dapat memanggil fungsi swapTwoInts ( : :) dengan dua variabel bertipe Int untuk menukar nilainya. Perhatikan bahwa nama someInt dan anotherInt diawali dengan ampersand saat diteruskan ke fungsi swapTwoInts ( : :):
Contoh di atas menunjukkan bahwa nilai asli someInt dan anotherInt dimodifikasi oleh fungsi swapTwoInts ( : :), meskipun awalnya ditentukan di luar fungsi.
CATATAN
Parameter masuk-keluar tidak sama dengan mengembalikan nilai dari suatu fungsi. Contoh swapTwoInts di atas tidak mendefinisikan tipe pengembalian atau mengembalikan nilai, tetapi masih mengubah nilai someInt dan anotherInt. Parameter masuk-keluar adalah cara alternatif agar suatu fungsi memiliki efek di luar ruang lingkup badan fungsinya.
sumber
Ini ide lainnya. Kasus penggunaan saya adalah untuk melewatkan array string untuk ditambahkan ke dalamnya, yang array harus dilewatkan secara bergilir. Saya juga tidak ingin mendapat status di kelas saya untuk ini. Jadi saya membuat kelas yang menampung array dan meneruskannya. Bergantung pada kasus penggunaan Anda, mungkin tampak konyol memiliki kelas yang hanya berisi satu variabel itu.
Saya hanya menggunakan
append
danjoined
metode pada array sehingga mudah untuk mengubah tipe dengan sedikit perubahan lain pada kode saya.Beberapa contoh penggunaan:
sumber