में इनिट विधि के भीतर तर्क के रूप में स्वयं को पास करें निम्नलिखित श्रेणी में 'let
' संपत्ति को स्पष्ट रूप से अनचाहे चर के रूप में घोषित किया गया है। यह पहले से Xcode 6.2 के साथ काम किया: Xcode 6.3 के लिए अद्यतन करने के बादस्विफ्ट 1.2
class SubView: UIView {
let pandGestureRecognizer: UIPanGestureRecognizer!
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.pandGestureRecognizer = UIPanGestureRecognizer(target: self, action: "panAction:")
}
func panAction(gesture: UIPanGestureRecognizer) {
// ...
}
}
(स्विफ्ट 1.2 के साथ), निम्नलिखित संकलन त्रुटियां होती हैं:
Property 'self.panGestureRecognizer' not initialized at super.init call
Immutable value 'self.panGestureRecognizer' may only be initialized once
super.init
कॉल करने से पहले निम्न पंक्ति में ले जाने:
'self' is used before super.init call
:
self.pandGestureRecognizer = UIPanGestureRecognizer(target: self, action: "panAction:")
निम्न त्रुटि देता है
संपत्ति 'panGestureRecognizer
' को कोई उत्परिवर्तन की आवश्यकता नहीं है, इसलिए इसे निरंतर let
'घोषित किया जाना है। चूंकि यह स्थिर है, इसलिए इसे घोषणा पर प्रारंभिक मूल्य होना चाहिए, या init
विधि के भीतर इसे प्रारंभ करना होगा। इसे आरंभ करने के लिए, इसे 'target
' पैरामीटर में 'self
' पास करना होगा।
अन्य धागे ने इसे स्पष्ट रूप से अनचाहे वैकल्पिक घोषित करने का सुझाव दिया, और इसे super.init
कॉल के बाद शुरू किया। यह पहले तक काम करता था जब तक कि मैंने एक्सकोड 6.3 में अपडेट नहीं किया।
क्या कोई इस मामले के लिए उचित कार्यान्वयन या कामकाज जानता है?
यह भाषा के क्रियान्वयन, या यहां तक कि एक विनिर्देशन में एक बग की तरह दिखता है। ऐप्पल के साथ एक बग रिपोर्ट दर्ज करना एक अच्छा विचार है। दुर्भाग्यवश, जब आप अपेक्षाकृत जटिल होते हैं तो एक नई प्रोग्रामिंग भाषा के बीटा-परीक्षण के लिए साइन अप करते समय आपको यही मिलता है। – dasblinkenlight
इसे निरंतर जाने के रूप में घोषित नहीं किया जाना चाहिए। वास्तव में, यदि आप इसे अपनी फ़ाइल के शीर्ष पर वैकल्पिक रूप से घोषित करने जा रहे हैं, तो आपको इसे var के रूप में घोषित करने की आवश्यकता है ताकि आप इसे init विधि में तुरंत चालू कर सकें। – rdelmar
@rdelmar आप घोषित करने की घोषणा कर सकते हैं यह सिर्फ यह लागू करता है कि वे super.init से पहले instatiated हैं। – Fogmeister