การส่งผ่านฟังก์ชันเป็นอาร์กิวเมนต์เมื่อฟังก์ชันมีลายเซ็นต่างกัน

ฉันแดงคำตอบมากมายแต่ไม่พบคำตอบที่แน่ชัดสำหรับคำถามของฉัน

ใน Swift ฉันมีวิธีการที่แตกต่างกัน 3 วิธี (หรือมากกว่า) สิ่งเดียวที่พวกเขามีเหมือนกันคือประเภทการคืนสินค้า เช่น

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

ฉันต้องส่งฟังก์ชันเป็นอาร์กิวเมนต์ของวิธีการเรียน เช่น

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

จากนั้นภายในเนื้อหาของวิธีนี้ฉันต้องการโทร:

functionToCall()

อย่างที่คุณเห็นมีปัญหาเกิดขึ้น: จะส่งอาร์กิวเมนต์ที่จำเป็นสำหรับลายเซ็นต่างๆ ได้อย่างไร?

ความช่วยเหลือคำแนะนำและทำไมไม่ชื่นชมมะเขือเทศเน่า :-)


person Community    schedule 03.08.2017    source แหล่งที่มา
comment
ใครเป็นผู้จัดหาค่าสำหรับการโต้แย้ง? พวกมันสามารถผ่านเข้าไปได้ด้วยเหรอ? บางทีในพจนานุกรม?   -  person vacawama    schedule 03.08.2017
comment
@vakawama แน่นอนฉันสามารถสร้าง MyType ก่อนที่จะส่งต่อ แต่คำถามของฉันคือ... คำถามเชิงทฤษฎี ;-)   -  person    schedule 03.08.2017
comment
คุณสามารถปิดฟังก์ชันโดยปิดพจนานุกรมประเภท [String: Any] แล้วคลายแพ็กและเรียกใช้ฟังก์ชันของคุณ จากนั้นคุณจะต้องส่งพจนานุกรมและการปิด ([String: Any]) -> MyType ไปยังฟังก์ชันของคุณ และมันจะเรียก functionToCall(dict) เมื่อถึงเวลา   -  person vacawama    schedule 03.08.2017
comment
ฉันหวังไว้ใน perform และ NSSelectorFromString แต่ก็มีข้อจำกัดเล็กน้อย   -  person    schedule 03.08.2017


คำตอบ (1)


ไปแบบนี้ก็ได้

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
คุณแน่ใจหรือว่ากำลังตอบคำถามของฉัน? - person ; 03.08.2017
comment
ใช่ผู้ชาย. คุณต้องการอะไร? ฉันควรวางรหัสของคุณให้ตรงกันหรือไม่ คุณมี functionToCall ส่งลายเซ็นใดก็ได้ ตอนนี้ขึ้นอยู่กับลายเซ็นที่ส่งผ่านเรียกมัน - person Mohammad Sadiq; 03.08.2017
comment
โอเค ขอบคุณ แต่ฉันกำลังมองหาบางอย่างที่แตกต่างออกไป โซลูชันนี้อาจรักษาได้ยาก (ทุกครั้งที่คุณเพิ่มฟังก์ชันใหม่ คุณต้องปรับฟังก์ชัน getData นี้ด้วย: ฉันพูดถูกไหม หรือฉันพลาดอะไรบางอย่างไป) - person ; 03.08.2017
comment
นี่คือสิ่งที่ดีที่สุดที่เราสามารถทำได้ อย่างที่คุณเห็นนี่จะเป็นการโทรกลับ ดังนั้น เมื่อเรียก fuctionToCall จะต้องทราบพารามิเตอร์ที่จะส่งไปยัง functionToCall ขวา? ตอนนี้ถ้าคุณเพิ่มคำจำกัดความฟังก์ชันอื่น getData จำเป็นต้องได้รับการอัปเดตเพื่อส่งผ่านและเรียกใช้วิธีการที่ถูกต้อง หากปราศจากสิ่งนั้นก็จะเป็นไปไม่ได้ คุณจะเรียกใช้ functionToCall เหมือน functionToCall() ได้อย่างไร ในเมื่อควรเป็น funtionToCall(String, Int... ฯลฯ) - person Mohammad Sadiq; 03.08.2017
comment
โอเค อย่างที่ฉันบอกไปก่อนหน้านี้ ฉันหวังว่าจะมีเวทย์มนตร์ perform, NSSelectorFromString หรือการสะท้อนกลับ - person ; 03.08.2017