2015-02-27 7 views
5
में केवल पैरामीटर नाम में अंतर के साथ कार्यों को स्पष्ट करने के लिए कैसे

मैं निम्नलिखित कार्य किया है:स्विफ्ट

func moveThing(thing: AnyObject, toLeft length: Int) {} 
func moveThing(thing: AnyObject, toRight length: Int) {} 

हालांकि, जब मैं एक पैरामीटर के रूप कार्यों में से एक पास, संकलक " 'moveThing की अस्पष्ट उपयोग के बारे में शिकायत '

func exec(function: (AnyObject, Int) ->()) {} 
exec(moveThing) // Apparently ambiguous 
exec(moveThing as (AnyObject, toLeft: Int) ->()) // Still ambiguous 

मैं अस्पष्टता को कैसे हल कर सकता हूं?

+0

संभवतः डुप्लिकेट [स्विफ्ट - वेरिएबल को ओवरलोडेड फ़ंक्शन असाइन करना] (http://stackoverflow.com/questions/28284924/swift-assigning-overloaded-function-to-variable) –

+0

आप ऐसा क्यों करना चाहते हैं? क्यों moveThingLeft और moveThingRight का उपयोग नहीं करते? यदि आप अस्पष्टता को हल करने में सक्षम थे तो आप इसका उपयोग कैसे करने की योजना बना रहे हैं? – holroy

+0

यह वास्तव में मौजूदा उद्देश्य-सी एपीआई का एक बंदरगाह है। मैं चयनकर्ताओं का उपयोग करके उन्हें आसानी से असंबद्ध कर सकता हूं "moveThing: toLeft:" और "moveThing: toRight:"। हालांकि, इसे स्विफ्ट के साथ दिमाग में डिजाइन किया गया था, नामकरण अलग हो सकता है। इसके अलावा, ऐप्पल इसे बहुत कुछ करता है, उदाहरण के लिए, UITableViewDataSource में, कई विधियां tableView (UITableView, XXX: NSIndexPath) से शुरू होती हैं। –

उत्तर

0

एक दिलचस्प सवाल! मुझे नहीं लगता कि आप इस समय कर सकते हैं, क्योंकि ऐसा लगता है कि पैरामीटर नाम फंक्शन संदर्भ नाम का हिस्सा नहीं हैं, हालांकि मुझे ऐप्पल के संदर्भ दस्तावेज़ीकरण से कुछ भी नहीं मिला जो स्पष्ट रूप से इसे निर्देशित करता है।

बेशक, इस विशिष्ट उदाहरण के लिए, आप

exec({ moveThing($0, toLeft: $1) }) 
exec({ moveThing($0, toRight: $1) }) 

उपयोग कर सकते हैं, लेकिन मैं देख रहा हूँ आप सरल उदाहरण के साथ के बाद क्या कर रहे हैं।

1

स्विफ्ट इवोल्यूशन प्रस्ताव SE-0021 ने इन कार्यों को असंबद्ध करने के लिए moveThing(_:toLeft:) को अनुमति देकर इसे संबोधित किया, और इसे स्विफ्ट 2.2 में लागू किया गया।