2014-06-25 11 views
19

में फ़ंक्शंस का ऐरे जावास्क्रिप्ट जैसे किसी सरणी में बाद में कॉलबैक के लिए फ़ंक्शंस की एक सरणी कैसे संग्रहीत कर सकता हूं? कोई भी और AnyObject प्रकार विभिन्न प्रकार के विधि हस्ताक्षरों के साथ फ़ंक्शन नहीं रख सकता है।स्विफ्ट

+0

अपवाद हैंडलिंग के बिना, मैं इस के लिए किसी भी उपयोग के बारे में सोच नहीं कर सकते। क्या आप हमारे लिए प्रश्न के लिए थोड़ा और संदर्भ जोड़ सकते हैं? – Jiaaro

+0

बंद करने पर एक नज़र डालें, वे इस तरह की चीजों के लिए बहुत आदर्श हैं। –

+1

'ऐरे शून्य>' या अपठनीय संस्करण '(() ->()) [] ' –

उत्तर

16

आप विभिन्न कार्यों को ऐरे में डालने के लिए एक एनम का उपयोग कर सकते हैं और फिर स्विच के साथ कार्यों को निकाल सकते हैं।

enum MyFuncs { 
     case Arity0 (Void -> Void) 
     case Arity2 ((Int, String) -> Void) 
    } 

    func someFunc(n:Int, S:String) { } 
    func boringFunc() {} 
    var funcs = Array<MyFuncs>() 
    funcs.append(MyFuncs.Arity0(boringFunc)) 
    funcs.append(MyFuncs.Arity2(someFunc)) 

    for f in funcs { 
     switch f { 
     case let .Arity0(f): 
      f() // call the function with no arguments 
     case let .Arity2(f): 
      f(2,"fred") // call the function with two args 
     } 
    } 
+1

मैंने अभी इस जवाब को उतारने के लिए लॉग इन किया है। यह विचार अद्भुत दिखता है, बशर्ते कि आप समय पर संकलन समय पर कार्य प्रकारों के सभी संभावित संयोजन लिख सकें। – Alex

+0

विषम, यह वैश्विक क्षेत्र में एक खेल के मैदान में मेरे लिए काम करता है, लेकिन अगर मैं कक्षा के अंदर उपयोग नहीं करता हूं। – netskink

+0

आह, यह काम करता है। मुझे कुछ लाइनों को नियमित रूप से स्थानांतरित करने की आवश्यकता है। कोई बात नहीं। साफ कोड के लिए बहुत धन्यवाद। – netskink

7

नोट: यह उत्तर स्विफ्ट संस्करण 1.0 और निम्न के लिए है।

विभिन्न पैरामीटर और रिटर्न प्रकार वाले फ़ंक्शन एक अलग प्रकार के होते हैं ताकि उन्हें एक सरणी में एक साथ संग्रहीत नहीं किया जा सके। वे किसी भी या किसी भी ऑब्जेक्ट प्रोटोकॉल के अनुरूप नहीं हैं।

यदि आपके पास समान पैरामीटर के साथ कार्य हैं, तो आप इसके आसपास काम कर सकते हैं। भले ही नीचे दिए गए कार्य डबल और एक इंट के टुपल लौटते हैं, फिर भी उन्हें () -> Any फ़ंक्शन प्रकारों के रूप में परिभाषित किया जा सकता है।

func func1() -> Int { 
    return 1 
} 
func func2() -> (Double, Double){ 
    return (2, 3) 
} 
var a:() -> Int = func1 
var b:() -> (Double, Double) = func2 

var arr: Array<() -> Any> = [a, b] 
+0

आइए कहें कि मैं इनपुट के रूप में दो पैरामीटर के साथ एक फ़ंक्शन लेना चाहता हूं और केवल एक पैरामीटर के साथ। यह तब काम नहीं करता है। –

+0

हाँ। कोई समाधान नहीं है। यह सिर्फ एक कामकाज है जो एक विशिष्ट मामले – connor

+0

@EncorePTL में काम करता है, जो परिदृश्य आपको हाइलाइट किया गया है, वह अभ्यास में काम नहीं करेगा, भले ही आप विभिन्न पैरामीटर सूची के साथ विधि को संग्रहीत करने के इच्छुक हों, भले ही यह व्यावहारिक रूप से बेकार सरणी है तरीकों। – holex

3

नीचे एक सरणी और एक शब्दकोश दोनों के साथ एक उदाहरण है। एक्सकोड 6.1 (6 ए 1046 ए) में परीक्षण और काम करना। ध्यान दें कि शब्दकोशों के कार्यों को पहले अनचाहे किया जाना चाहिए।

हालांकि इस तकनीक में अलग-अलग पैरामीटर या रिटर्न प्रकार होते हैं, उनके जवाब में कॉनर द्वारा समझाए गए कारणों के लिए।

class MyViewController: UIViewController 
{ 
    let arrayOfFunctions = [function1, function2] 

    let dictionaryOfFunctions = [ 
     "function1": function1, 
     "function2": function2 
    ] 

    func function1() { 
     NSLog("function1") 
    } 

    func function2() { 
     NSLog("function2") 
    } 

    override func viewDidLoad() 
    { 
     let fn1 = arrayOfFunctions[0] 
     fn1(self)() 

     let fn2 = dictionaryOfFunctions["function2"] 
     fn2!(self)() 
    } 
} 
+0

xcode 9.2 और स्विफ्ट 3.2 पर काम करता है। जैसे 'वर कार्यों = [जोड़ने के लिए, massText] में इसका इस्तेमाल किया अगर हालत { actions.insert (massMsg, पर: 1) } ' कार्यों [SelectedIndex] द्वारा ' कॉल()' –

3

स्विफ्ट 1.1 के रूप में, सभी फ़ंक्शन प्रकार किसी के अनुरूप होते हैं, ताकि आप किसी भी सरणी में फ़ंक्शंस रख सकें।

func foo (str: String) -> Int { 
    return 1 
} 
func bar() -> (Double, Double){ 
    return (2, 3) 
} 
var a: Any = foo 
var b: Any = bar 

var arr: Any = [a, b]