2017-01-18 14 views
5

मैं स्विफ्ट में एक कस्टम ऑपरेटर को बंद करने से पहले एक प्राथमिकता समूह के साथ परिभाषित करने की कोशिश कर रहा हूं। विशेष रूप से, मैं लिखने के लिए सक्षम होना चाहते हैं:प्राथमिकता समूह बंद होने से अधिक

foo --> bar { 
    //... 
} 

--> ऑपरेटर एक समारोह है कि प्रकार () -> Void के एक बंद लेता है के रूप में यह एकमात्र पैरामीटर है देता है।

हालांकि, मैं केवल

(foo --> bar) { 
    //... 
} 

काम करने के लिए प्राप्त करने में सक्षम किया गया है। क्या कोई ऑपरेटर प्राथमिकता है जो बिना काम के इस काम को कर सकती है?

यहाँ के लिए

precedencegroup LongArrowPrecedence { 
    associativity: left 
    higherThan: AssignmentPrecedence 
} 

infix operator --> : LongArrowPrecedence 

धन्यवाद पूर्वता समूह है!

उत्तर

5

हम पहले एक पूर्ण और निरीक्षण उदाहरण की स्थापना:

precedencegroup LongArrowPrecedence { 
    associativity: left 
    higherThan: AssignmentPrecedence 
} 

infix operator --> : LongArrowPrecedence 

func -->(lhs: Int, rhs: Int) -> (() ->()) ->() { 
    return { print(lhs+rhs, terminator: ""); $0() } 
} 

साथ ही इस ऑपरेटर का उपयोग paranthesis-गले लगा लिया मान्य कॉल के उदाहरण हैं, तुरंत बंद जो --> रिटर्न के लिए एक कॉल के बाद।

let foo = 1 
let bar = 2 

// OK 
(foo --> bar) { 
    print(" is the magic number") 
} // 3 is the magic number 

// OK 
((-->)(foo, bar)) { 
    print(" is the magic number") 
} // 3 is the magic number 

यह हमें बहुत नहीं बताता है, लेकिन अगर हम निम्नलिखित में नाकाम रहने के मामलों का अध्ययन

// ERROR: cannot call value of non-function type 'Int' 
foo --> bar { 
    print(" is the magic number") 
} // 3 is the magic number 

// ... equivalent to 
// ERROR: cannot call value of non-function type 'Int' 
foo --> bar({ 
    print(" is the magic number") 
}) // 3 is the magic number 

हम समझते हैं कि इस मुद्दे को यहाँ "पूर्वता को बंद करने की तुलना में कम" नहीं है, बल्कि कि function-call-argument-clause (किसी भी पोस्टफिक्स-अभिव्यक्ति के बाद पैराथेस का एक सेट) उस पोस्टफिक्स-अभिव्यक्ति के लिए कॉल पर कॉल करेगा, जैसे कि पोस्टफिक्स-अभिव्यक्ति एक विधि/कार्य/बंद थी। यदि पोस्टफिक्स-अभिव्यक्ति कॉल करने योग्य नहीं है, या यदि फ़ंक्शन-कॉल-तर्क-खंड के भीतर कॉल कॉल करने योग्य के किसी भी अधिभार से मेल नहीं खाता है, तो संकलक एक त्रुटि उत्पन्न करेगा। जबकि प्रमुख मुद्दा है कि स्विफ्ट एक समारोह-कॉल-तर्क-क्लॉज लागू होगी यह बस लौटे बंद करने के लिए एक तर्क दिया गया है:

42()   // ERROR: cannot call value of non-function type 'Int' 
let foo = 42 
foo()   // ERROR: cannot call value of non-function type 'Int' 

func bar() {} // ERROR: argument passed to call that takes no arguments 
bar(42) 

इसलिए, अनुगामी बंद बंद --> से लौटे करने के लिए आपूर्ति नहीं प्रासंगिक यहाँ है पोस्टफिक्स-अभिव्यक्ति के लिए जो तुरंत खंड से पहले है। उदाहरण में, bar उस पोस्टफिक्स अभिव्यक्ति का गठन करता है, और केवल तभी जब आप पैरामीटर में foo --> bar लपेटते हैं तो संयुक्त लिपटे अभिव्यक्ति पोस्टफिक्स-अभिव्यक्ति का गठन करेगी जिस पर निम्न फ़ंक्शन-कॉल-तर्क-खंड लागू होता है।

पोस्टफिक्स भाव

पोस्टफिक्स भाव एक अभिव्यक्ति के लिए एक पोस्टफ़िक्स ऑपरेटर या अन्य पोस्टफ़िक्स वाक्य रचना लगाने से बनते हैं। संवैधानिक रूप से, प्रत्येक प्राथमिक अभिव्यक्ति भी एक पोस्टफिक्स अभिव्यक्ति है।

प्राथमिक भाव

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

आप इसे रोकने में सक्षम नहीं होंगे, क्योंकि ऑपरेटर प्राथमिकता फ़ंक्शन-कॉल-तर्क-खंड पर लागू नहीं होती है; उत्तरार्द्ध (और इसकी "प्राथमिकता") को फ़ंक्शन कॉल अभिव्यक्ति के व्याकरण द्वारा परिभाषित किया गया है।

संबंधित मुद्दे