Dalam Bahasa Pemrograman Swift , dikatakan:
Fungsi juga dapat mengambil sejumlah variabel argumen, mengumpulkannya ke dalam array.
func sumOf(numbers: Int...) -> Int { ... }
Ketika saya memanggil fungsi tersebut dengan daftar angka yang dipisah koma (`sumOf (1, 2, 3, 4), mereka tersedia sebagai larik di dalam fungsi.
Pertanyaan: bagaimana jika saya sudah memiliki array angka yang ingin saya sampaikan ke fungsi ini?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
Ini gagal dengan kesalahan kompiler, "Tidak dapat menemukan kelebihan untuk '__ konversi' yang menerima argumen yang disediakan". Apakah ada cara untuk mengubah array yang ada menjadi daftar elemen yang bisa saya sampaikan ke fungsi variadic?
swift
variadic-functions
Ole Begemann
sumber
sumber
Jawaban:
Pukulan belum dalam bahasa , seperti dikonfirmasi oleh devs. Solusi untuk saat ini adalah dengan menggunakan kelebihan atau menunggu jika Anda tidak dapat menambahkan kelebihan.
sumber
sumOf(...numbers)
print
!Ini pekerjaan yang saya temukan. Saya tahu itu tidak persis apa yang Anda inginkan, tetapi tampaknya berhasil.
Langkah 1: Nyatakan fungsi yang Anda inginkan dengan array alih-alih argumen variadik:
Langkah 2: Panggil ini dari dalam fungsi variadic Anda:
Langkah 3: Panggil Either Way:
Kelihatannya aneh, tetapi itu berhasil dalam pengujian saya. Beri tahu saya jika ini menyebabkan masalah yang tidak terduga bagi siapa pun. Swift tampaknya dapat memisahkan perbedaan antara dua panggilan dengan nama fungsi yang sama.
Selain itu, dengan metode ini jika Apple memperbarui bahasa seperti jawaban @ manojid, Anda hanya perlu memperbarui fungsi-fungsi ini. Jika tidak, Anda harus melalui dan melakukan banyak penggantian nama.
sumber
Anda dapat menggunakan fungsi ini:
sumber
func sumOf(foo numbers: Int..., bar: Bool) -> Int {};
membutuhkantypealias Function = (foo: [Int], bar: Bool) -> Int;
unsafeBitCast
. Ini mungkin berfungsi hari ini, tetapi kecuali jika referensi mengatakannya, versi selanjutnya dari kompiler bebas untuk melakukan apa pun di sini (kesalahan kompiler / crash / mengeksekusi kode secara acak ...). Lihat peringatan serius yang terlihat di unsafeBitCast .Anda dapat menggunakan fungsi pembantu seperti:
sumber
Int...
dan tidak dapat (dengan mudah) diubah?apply
prosedur. Saya mengumpulkan beberapa orang menyebutnya 'splatting'.sumArray
dirujuk di sini?Saya tahu respons ini tidak menjawab pertanyaan persis Anda, tetapi saya merasa perlu untuk diperhatikan. Saya juga mulai bermain dengan Swift dan segera mengalami pertanyaan serupa. Jawaban Manojlds lebih baik untuk pertanyaan Anda, saya setuju, tapi sekali lagi, solusi lain yang saya temukan. Kebetulan aku juga menyukai Logan.
Dalam kasus saya, saya hanya ingin melewatkan array:
Hanya ingin berbagi, kalau-kalau ada orang yang berpikir seperti saya. Sebagian besar waktu saya lebih suka melewati array seperti ini, tetapi saya belum memikirkan "Swiftly". :)
sumber
Saya melakukan ini (Wrapper + Identity Mapping):
sumber
Cepat 5
Ini adalah pendekatan dengan
@dynamicCallable
fitur yang memungkinkan untuk menghindari kelebihan muatan atauunsafeBitCast
tetapi Anda harus membuatstruct
panggilan khusus:sumber