2015-07-15 13 views
8

में साइकिल बनाए रखें मेरे पास UIViewController है और इसमें UIToolbar है। वे एक स्टोरीबोर्ड से तत्काल हो जाते हैं।स्विफ्ट प्रतिनिधि

मैंने अपने UIToolbar के लिए एक कस्टम क्लास बनाया है। कुछ तर्कों के आधार पर मैं करता हूं या उस पर बटन नहीं दिखाता हूं।

UIViewController कुछ बटन टैप किए जाने पर कार्रवाई करने की आवश्यकता है। इसके लिए मैंने UIToolbar में एक प्रतिनिधि प्रोटोकॉल बनाया।

वर्तमान में, जब मैं दृश्य को खारिज करता हूं, तो इसे स्मृति में रखा जाता है। आगे की जांच से पता चला कि मेरे प्रतिनिधि ने एक बनाए रखा चक्र बनाया है।

उद्देश्य-सी में, हम बस प्रतिनिधियों को weak के रूप में परिभाषित करेंगे। हालांकि, मैं स्विफ्ट का उपयोग कर रहा है, और यह मुझे weak रूप delegate चर को परिभाषित करने की अनुमति नहीं है:

weak var navigationDelegate: MainToolBarDelegate? 
// 'weak' cannot be applied to non-class type 'MainToolBarDelegate' 

जब मैं दृश्य नियंत्रक खारिज, मैं self.toolBar.navigationDelegate = nil सेट और स्मृति को मंजूरी दे दी हो जाता है। लेकिन यह गलत लगता है!

मुझे बनाए रखने का चक्र क्यों मिलता है और मैं प्रतिनिधि को weak के रूप में परिभाषित क्यों नहीं कर सकता?

+2

क्या आपका नेविगेशन एक प्रोटोकॉल डिलीगेट करता है (जैसा कि [वर्ग-केवल प्रोटोकॉल] के विपरीत है (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/ डॉक्टर/यूआईडी/टीपी 40014097-सीएच 25-आईडी 281)?) यदि यह सिर्फ एक मानक प्रोटोकॉल है, तो कोई गारंटी नहीं है कि आपकी वास्तविक वस्तु संरचना के बजाय कक्षा उदाहरण होगी, इसलिए "गैर-वर्ग प्रकार पर लागू नहीं किया जा सकता"; यदि यह संरचना या enum हो सकता है, तो यह 'कमजोर' नहीं हो सकता है, क्योंकि यह संदर्भ प्रकार नहीं हो सकता है। –

उत्तर

14

weak संदर्भ केवल कक्षाओं पर लागू होते हैं, न कि structs या enums, जो मूल्य प्रकार हैं। लेकिन डिफ़ॉल्ट रूप से प्रोटोकॉल उन किसी भी प्रकार पर लागू हो सकते हैं।

परिभाषित करें अपने MainToolBarDelegate एक वर्ग केवल प्रोटोकॉल के रूप में:

protocol MainToolBarDelegate: class { 

} 

तो फिर तुम weak के रूप में अपने प्रतिनिधि की घोषणा करने में सक्षम हो जाएगा।

+0

क्या आप जानते हैं कि कक्षा के उपयोग में कोई अंतर है या नहीं: NSObjectProtocol – user2363025

+1

@ user2363025 'class' का अर्थ किसी भी वर्ग का है, और 'NSObjectProtocol' का अर्थ इस प्रोटोकॉल के अनुरूप है। मैं 'कक्षा' का उपयोग तब तक करूंगा जब तक आपके पास 'NSObjectProtocol' का उपयोग करने का कोई विशिष्ट कारण न हो। –

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