2014-10-14 10 views
6

मैं एक नया स्विफ्ट ऐप बनाने पर काम कर रहा हूं जो मोटे तौर पर पुराने ओब्जे-सी ऐप पर आधारित है। मैं वर्तमान में प्रतिनिधियों पर काम कर रहा हूँफ़ाइल का दायरा? स्विफ्ट प्रतिनिधि और प्रोटोकॉल

यहाँ क्या मेरी Obj सी कोड

@interface MyAppViewController : CustomViewController 
@property (nonatomic, weak) id<MyAppViewControllerDelegate> delegate; 
@end 

@protocol MyAppViewControllerDelegate <NSObject> 
- (void)myAppViewController:(MyAppViewController *)controller loggedInStudent: (MYStudent *)student; 
- (void)myAppViewControllerWantsSignUp:(MyAppViewController *)controller; 
@end 

ज फ़ाइल में की तरह दिखाई देता स्विफ्ट मैंने किया था में है:

class MyAppViewController: CustomViewController { 

var delegate: MyAppViewControllerDelegate? 
protocol MyAppViewControllerDelegate{ 
func myAppViewController(controller: MyAppViewController, loggedInStudent:  MYStudent) 
func myAppViewControllerWantsSignUp(controller: MyAppViewController) 

मेरे द्वारा की गई इस पर बहुत सी पढ़ाई और अध्ययन, इसलिए मैंने सोचा कि मैं इसे मूल रूप से सही कर रहा था (हालांकि पूरी तरह से नया करने के लिए नया ... इसलिए)

मुझे यह त्रुटि मिल रही है, हालांकि Declaration is only valid in file scope "पर मुझे लगता है कि इसे कक्षा में घोषित करने के साथ कुछ करने के लिए किया गया था, इसलिए मैंने इसे बाहर ले जाया, केवल अब कक्षा के भीतर मेरा कोड घोषित प्रतिनिधि चर को पहचानता नहीं है ..

कोई विचार?

उत्तर

6

इस होना चाहिए:

protocol MyAppViewControllerDelegate { 
    func myAppViewController(controller: MyAppViewController, loggedInStudent:  MYStudent) 
    func myAppViewControllerWantsSignUp(controller: MyAppViewController) 
} 

class MyAppViewController: CustomViewController { 

    var delegate: MyAppViewControllerDelegate? 
} 

हालांकि, आप एक आम पैटर्न जहां उद्देश्य यह है कि MyAppViewController का मालिक भी अपने प्रतिनिधि है का पालन कर रहे हैं, तो यह स्मृति समस्याओं का कारण बन सकता है। तुम इतनी तरह कमजोर प्रतिनिधिमंडल अनुमति देने के लिए class लेखन का उपयोग कर सकते हैं:

protocol MyAppViewControllerDelegate : class { 
    func myAppViewController(controller: MyAppViewController, loggedInStudent:  MYStudent) 
    func myAppViewControllerWantsSignUp(controller: MyAppViewController) 
} 

class MyAppViewController: CustomViewController { 

    weak var delegate: MyAppViewControllerDelegate? 
} 

यह थोड़ा सीमित कर रहा है, क्योंकि यह आपके प्रतिनिधि के लिए एक वर्ग का उपयोग करने की आवश्यकता है, लेकिन यह मदद से बचने जाएगा चक्र :)

बनाए रखने
2

जो मैं आपके स्रोत कोड में देखता हूं वह यह है कि आपने अपना प्रोटोकॉल अपनी कक्षा के अंदर घोषित कर दिया है। कक्षा घोषणा के बाहर प्रोटोकॉल की घोषणा करें और आप ठीक होंगे।

अद्यतन:

डिफ़ॉल्ट पहुँच स्तर आंतरिक के लिए निर्धारित है जो

आंतरिक पहुंच के रूप में परिभाषित किया गया है संस्थाओं उनके परिभाषित करने मॉड्यूल से किसी भी स्रोत फ़ाइल के भीतर इस्तेमाल किया जाएगा,> लेकिन नहीं में सक्षम बनाता है उस मॉड्यूल के बाहर कोई भी स्रोत फ़ाइल। जब आप किसी ऐप या फ्रेमवर्क की आंतरिक संरचना को परिभाषित करते हैं तो आप आम तौर पर आंतरिक पहुंच का उपयोग करते हैं।

उद्देश्य-सी या सी के विपरीत आपको उपयोग से पहले कार्यान्वयन नहीं हुआ है, तो आपको आगे की घोषणा की आवश्यकता नहीं है।

स्रोत: The Swift Programming Language, Access Control

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