Meneruskan fungsi sebagai argumen ketika fungsi memiliki tanda tangan berbeda

Saya mendapatkan banyak jawaban tetapi saya tidak dapat menemukan jawaban pasti atas pertanyaan saya.

Di Swift, saya memiliki 3 (atau lebih) metode berbeda. Satu-satunya kesamaan yang mereka miliki adalah tipe pengembaliannya, misalnya.

A(a:String)->MyType
B(a:Int,b:String,c:AnyObject,d:Whatever)->MyType
C(a:Int,b:String,c:Other)->MyType

Saya perlu meneruskan fungsi sebagai argumen metode kelas, misalnya.

myClass.configureIOTDevice(configFile:String, functionToCall:A)

Kemudian, di dalam isi metode ini saya ingin memanggil:

functionToCall()

Seperti yang Anda lihat, muncul masalah: bagaimana cara menyampaikan argumen yang diperlukan untuk tanda tangan yang berbeda?

Bantuan apa pun, tip dan, mengapa tidak, tomat busuk sangat dihargai :-)


person Community    schedule 03.08.2017    source sumber
comment
Siapa yang memberikan nilai argumen? Bisakah mereka diteruskan juga? Mungkin di kamus?   -  person vacawama    schedule 03.08.2017
comment
@vacawama Tentu saja, saya dapat membuat MyType sebelum meneruskannya, tetapi pertanyaan saya adalah... semacam pertanyaan teoretis ;-)   -  person    schedule 03.08.2017
comment
Anda dapat membungkus fungsi Anda dalam penutupan yang menggunakan kamus tipe [String: Any] dan membongkarnya serta memanggil fungsi Anda. Kemudian Anda akan meneruskan kamus dan penutupan ([String: Any]) -> MyType ke fungsi Anda dan fungsi itu akan memanggil functionToCall(dict) ketika saatnya tiba.   -  person vacawama    schedule 03.08.2017
comment
Saya berharap pada perform dan NSSelectorFromString, tetapi keduanya agak terbatas   -  person    schedule 03.08.2017


Jawaban (1)


Anda bisa pergi seperti ini

func getData( functionToCall : Any) {
    if let function = functionToCall as? ()-> Void {
        function()
    }
    else if let function = functionToCall as? (String, String) -> Int {
        let result = function("a","b")
    }
}
person Mohammad Sadiq    schedule 03.08.2017
comment
Apakah Anda yakin menjawab pertanyaan saya? - person ; 03.08.2017
comment
YA kawan. Apa maumu? Haruskah saya menempelkan kode Anda dengan tepat. Anda memiliki functionToCall, berikan tanda tangan apa pun ke dalamnya. Sekarang tergantung pada tanda tangan apa yang diberikan, sebut saja. - person Mohammad Sadiq; 03.08.2017
comment
oke, terima kasih, tapi saya sedang mencari sesuatu yang berbeda, solusi ini bisa menjadi sulit untuk dipertahankan (setiap kali Anda menambahkan fungsi baru, Anda harus menyesuaikan fungsi getData ini juga: apakah saya benar? Atau apakah saya melewatkan sesuatu?) - person ; 03.08.2017
comment
Inilah yang terbaik yang bisa kami lakukan. Seperti yang Anda lihat, ini adalah panggilan balik. Jadi, saat memanggil fuctionToCall, ia perlu mengetahui parameter yang akan diteruskan ke functionToCall. Benar? Sekarang jika Anda menambahkan definisi fungsi lain, getData perlu diperbarui agar dapat meneruskan dan memanggil metode yang benar. Tanpa itu hal itu tidak mungkin terjadi. Bagaimana Anda bisa memanggil functionToCall seperti functionToCall() padahal seharusnya funtionToCall(String, Int... dll)?. - person Mohammad Sadiq; 03.08.2017
comment
Oke, seperti yang saya katakan sebelumnya, saya berharap pada sihir perform, NSSelectorFromString atau refleksi - person ; 03.08.2017