दिलचस्प पोस्ट
ऑब्जेक्ट स्लाइसिंग क्या है? जेएसओएन स्ट्रिंग को डिक्शनरी को सूची में परिवर्तित करना मैं प्रोग्राम को स्विफ्ट के संस्करण कैसे पा सकता हूं? वेब अनुप्रयोग पर तनाव परीक्षण करना? गतिशील रूप से three.js के साथ एक रेखा खींचना जावास्क्रिप्ट तारीख को दिनांक समय AVVideoCompositionCoreAnimationTool का उपयोग करते हुए CALayer में स्थिर छवि वाला वीडियो मिक्स करें getElementsByTagName () textNodes के बराबर है जावा में आधुनिक के लिए सिंटैक्स क्या है JQuery के साथ सीएसएस "टॉप" और "बाएं" एट्रिब्यूट निकालें ग्रेडल गैर-शून्य निकास मान 1 (ic_launcher.png: त्रुटि: डुप्लिकेट फ़ाइल) के साथ समाप्त हुआ जावास्क्रिप्ट प्रोटोटाइप ऑब्जेक्ट का उपयोग करते समय इवेंट विधियों में "यह" कीवर्ड डीबगर से निष्पादन को रोकना और जारी रखना संभव है? स्पष्ट रूप से जावा में एक डिफ़ॉल्ट विधि को बुला रहा है आईओएस पर डिवाइस के अभिविन्यास का मैं कैसे पता लगा सकता हूं?

स्विफ्ट कंपाइलर त्रुटि: स्ट्रिंग संयोजन पर "अभिव्यक्ति बहुत जटिल"

मुझे यह मनोरंजक कुछ भी से ज्यादा मिल रहा है मैंने इसे तय किया है, लेकिन मैं इस कारण के बारे में सोच रहा हूं यहां त्रुटि है: DataManager.swift:51:90: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions DataManager.swift:51:90: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions यह शिकायत क्यों है? यह सबसे आसान अभिव्यक्तियों में से एक जैसा लगता है।

कंपाइलर columns + ");"; को इंगित करता columns + ");"; अनुभाग

 func tableName() -> String { return("users"); } func createTableStatement(schema: [String]) -> String { var schema = schema; schema.append("id string"); schema.append("created integer"); schema.append("updated integer"); schema.append("model blob"); var columns: String = ",".join(schema); var statement = "create table if not exists " + self.tableName() + "(" + columns + ");"; return(statement); } 

ठीक है:

 var statement = "create table if not exists " + self.tableName(); statement += "(" + columns + ");"; 

यह भी काम करता है (@ एफ़िसचेंसी के माध्यम से), लेकिन मुझे यह उतना पसंद नहीं है क्योंकि मुझे लगता है कि ( हारें:

var statement = "create table if not exists \(self.tableName()) (\(columns))"

Solutions Collecting From Web of "स्विफ्ट कंपाइलर त्रुटि: स्ट्रिंग संयोजन पर "अभिव्यक्ति बहुत जटिल""

मैं कंपाइलर्स का एक विशेषज्ञ नहीं हूं – मुझे नहीं पता कि यह जवाब "एक सार्थक तरीके से आपके विचार कैसे बदल सकता है", लेकिन समस्या की मेरी समझ यह है कि:

इसे प्रकार अनुमान के साथ करना पड़ता है हर बार जब आप + ऑपरेटर का उपयोग करते हैं, तो स्विफ्ट को + और अनुमान के सभी संभावित अधिभारों के माध्यम से खोजना होगा जो आप का उपयोग कर रहे हैं। मैं + ऑपरेटर के लिए केवल 30 ओवरलोड के अंतर्गत गिना। यह कई संभावनाएं हैं, और जब आप 4 या 5 + संचालन को एक साथ मिलते हैं और सभी तर्कों का अनुमान लगाने के लिए संकलक को पूछते हैं, तो आप इसे पहले नज़र में दिखाई देने से बहुत अधिक पूछ रहे हैं।

यह अनुमान जटिल हो सकता है – उदाहरण के लिए, यदि आप एक UInt8 और Int का उपयोग करके + जोड़ते हैं, तो आउटपुट एक Int , लेकिन ऑपरेटर्स के प्रकारों के मिश्रण के नियमों का मूल्यांकन करने में कुछ काम है

और जब आप लिटरल्स का उपयोग कर रहे हैं, जैसे आपके उदाहरण में String लीटरल्स, तो कंपाइलर String को String में परिवर्तित करने के काम कर रहा है, और फिर तर्क + ऑपरेटर, और ऑपरेटर आदि के लिए रिटर्न टाइपिंग का काम कर रहा है।

यदि कोई अभिव्यक्ति पर्याप्त जटिल है – यानी, इसके लिए संकलक को तर्क और ऑपरेटर के बारे में बहुत सारे अनुमान बनाने की आवश्यकता है – यह समाप्त हो जाता है और आपको बताता है कि इसे छोड़ना

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

मेरी समझ यह है कि स्विफ्ट टीम कंपाइलर ऑप्टिमाइज़ेशन पर काम कर रही है जो इन त्रुटियों को कम सामान्य बनाती है। आप इस लिंक पर क्लिक करके एप्पल डेवलपर फ़ोरम पर इसके बारे में कुछ सीख सकते हैं ।

देव मंचों पर, क्रिस लेटनेर ने लोगों को इन त्रुटियों को रडार रिपोर्ट के रूप में दर्ज करने के लिए कहा है, क्योंकि वे उन्हें फिक्स करने पर सक्रिय रूप से काम कर रहे हैं।

इसी तरह मैं यहां कई पदों को पढ़ने और इसके बारे में देव फोरम पर पढ़ने के बाद समझता हूं, लेकिन कंपाइलर की मेरी समझ से सरल है, और मुझे उम्मीद है कि कोई भी इस बात को गहन ज्ञान दे सकता है कि वह इन कार्यों को कैसे संभालते हैं यहां लिखा है

यह स्वीकार किए गए उत्तर के समान है, लेकिन कुछ जोड़ा वार्ता के साथ (मैं रोब नेपियर और कोकोहेड की मुलाकात के दूसरे मित्र के साथ था) और लिंक

इस चर्चा में टिप्पणियां देखें। इसका सारांश है:

+ ऑपरेटर भारी अतिभारित है, क्योंकि अब इसमें 27 विभिन्न फ़ंक्शंस हैं, यदि आप 4 स्ट्रिंग्स को जोड़ते हैं, अर्थात् आपके पास 3 + ऑपरेटर हैं, तो संकलक को हर बार 27 ऑपरेटर के बीच चेक करना पड़ता है, ताकि 27 ^ 3 बार लेकिन ऐसा नहीं है।

यह देखने के लिए भी एक जांच है कि क्या + फ़ंक्शन के lhs और lhs दोनों मान्य हैं यदि वे कॉल करते हैं तो उन्हें append को कोर के माध्यम से कॉल किया जाता है वहां आप देख सकते हैं कि कुछ गहन जांच हो सकती हैं जो हो सकती हैं। यदि स्ट्रिंग गैर-कॉन्सीग्यूअली संग्रहीत है, जो ऐसा प्रतीत होता है कि अगर आप जिस स्ट्रिंग के साथ काम कर रहे हैं वह वास्तव में NSString को भुनाया जाता है। स्विफ्ट को फिर से सभी बाइट सरणी बफ़र्स को एक बार-बार बफर में फिर से इकट्ठा करना पड़ता है और जिस तरह से नए बफ़र्स बनाने की आवश्यकता होती है। और फिर आपको अंततः एक बफ़र मिलता है जिसमें स्ट्रिंग शामिल होती है जिसे आप एक साथ जोड़ना करने का प्रयास कर रहे हैं

संक्षेप में कंपाइलर चेक के 3 क्लस्टर हैं जो आपको धीमा कर देगा और इसलिए इंटरपोलेशन के साथ स्ट्रिंग्स को एक दूसरे के साथ " My fullName is \(firstName) \(LastName)" का प्रयोग करके " My fullName is \(firstName) \(LastName)" से बेहतर है "My firstName is" + firstName + LastName प्रक्षेपण में कोई ओवरलोडिंग नहीं है

स्विफ्ट 3 ने कुछ सुधार किए हैं। अधिक जानकारी के लिए कंपाइलर धीमा किए बिना एकाधिक अरेंजों को मर्ज करने के लिए कैसे पढ़ें ?