जब आप कुछ भी है कि "अजीब" स्विफ्ट, समय जवाब "ऑब्जेक्टिव-सी की वजह से" है के अधिकांश में लगता है के बारे में चिंता।
private
: केवल वर्ग है जिसमें यह परिभाषित किया गया है के लिए सुलभ कुछ परिप्रेक्ष्य के लिए, मैं 3 पहुंच का स्तर आम कई आधुनिक प्रोग्रामिंग भाषाओं पर विचार करें।
protected
: वर्ग जिसमें यह परिभाषित किया गया है और उसके उपवर्गों ही सुलभ।
public
: किसी भी बाहरी कार्यक्रम के लिए सुलभ।
के एक कदम और आगे वापस सी सी की दुनिया के लिए ले, चलो नहीं एक OOP भाषा जा रहा है कोई पहुँच संशोधक है। हालांकि, हकीकत में, यह एक निजी/सार्वजनिक प्रणाली होने के करीब है। यदि आप अन्य कार्यक्रमों को अपने प्रतीकों (कार्यों, मैक्रोज़, डेटा प्रकार इत्यादि) को जानना चाहते हैं, तो आप उन्हें अपने शीर्षलेख (.h
) फ़ाइल में परिभाषित करते हैं। यदि नहीं, तो आप उन्हें अपने स्रोत (.c
) फ़ाइल या एक निजी शीर्षलेख फ़ाइल में परिभाषित करते हैं।जो भी कार्यक्रम अपने प्रतीक में रुचि इसी हेडर फाइल में शामिल होंगे:
#include "foo.h"
यह #include
एक संकलक की मदद से नकल & पेस्ट से अधिक नहीं है। संकलक foo.h
में सभी प्रतीकों की प्रतिलिपि बनाता है और उन्हें अपनी स्रोत फ़ाइल में पुन: प्राप्त करता है।
चूंकि उद्देश्य-सी सी का सख्त सुपरसेट है, इसलिए प्रत्येक मान्य सी प्रोग्राम भी वैध उद्देश्य-सी प्रोग्राम है। ऑब्जेक्टिव-सी इस परंपरा जारी है: हेडर फाइल में अपनी सार्वजनिक तरीकों की घोषणा, कार्यान्वयन फाइल करने के लिए निजी तरीकों घोषणा रखें:
// ------------------------------------------
// MyClass.h
// ------------------------------------------
@interface MyClass: NSObject
- (void) publicMethod;
@end
// ------------------------------------------
// MyClass.m
// ------------------------------------------
#import "MyClass.h"
// Declare your private methods here.
// You can move this to a separate file, i.e. MyClass+Private.h if you want
@interface MyClass()
- (void) privateMethod;
@end
@implementation MyClas
- (void) publicMethod() { ... }
- (void) privateMethod() { ... }
@end
तो नज़र में, ऑब्जेक्टिव-सी सार्वजनिक/निजी घोषणाओं के सी प्रणाली के वारिस लगता है। हालांकि, उद्देश्य-सी एक बहुत ही गतिशील भाषा है। आप कक्षा, निजी या सार्वजनिक के सभी तरीकों के लिए अपने रनटाइम से पूछ सकते हैं। उद्देश्य-सी में एक्सेस कंट्रोल "इस विधि को आपके लिए सीमित है" के बजाय "प्रलेखन में जो कुछ मैं आपको बताता हूं उसका उपयोग करें" के बारे में अधिक है।
यह एक विरोधाभास है: आप उद्देश्य-सी में protected
कैसे कार्यान्वित करते हैं? इसके लिए इसका कोई अच्छा जवाब नहीं है। एक आम पैटर्न एक अलग घोषणा फ़ाइल में सभी सुरक्षित तरीकों को स्थानांतरित करने और मुख्य वर्ग और उपवर्ग के कार्यान्वयन में उन्हें आयात करने के लिए है:
// ------------------------------------------
// MyClass+Protected.h
// ------------------------------------------
@interface MyClass (Protected)
- (void) protectedMethod;
@end
// ------------------------------------------
// MySubClass.m
// ------------------------------------------
#import "MyClass+Protected.h"
...
स्विफ्ट बस, उस परंपरा पर किया जाता है बेहतर या बदतर के लिए। स्विफ्ट 3 में इसे बदलने के लिए an accepted proposal है। यदि कुछ भी हो, तो क्रिस लैटनर और स्विफ्ट टीम ने अतीत और सी की विरासत के लिए थोड़ा सा संबंध दिखाया है। आप ++
और सी-शैली को हटाने के साथ स्विफ्ट 2.2 में इसका सबूत देख सकते हैं। for
loops।
मैं इतना तेज़ नहीं कहूंगा कि यह encapsulation तोड़ता है। यदि आपके पास दो कक्षाएं हैं जो एक-दूसरे से संबंधित नहीं हैं (और एक दूसरे के आंतरिक के बारे में नहीं जानी चाहिए) तो शायद वे एक ही स्रोत फ़ाइल में नहीं होनी चाहिए। –
संबंधित: [एक्सेस कंट्रोल और संरक्षित] (https://developer.apple.com/swift/blog/?id=11) स्विफ्ट ब्लॉग में। –
@CraigOtis किस प्रकार को "संबंधित" के रूप में परिभाषित किया जा सकता है ताकि वे एक दूसरे के आंतरिक के साथ गड़बड़ कर सकें? दो अलग-अलग वर्गों को एक-दूसरे की निजी घटकों की अवधि के बारे में नहीं पता होना चाहिए। मैं अपने स्वयं के स्रोत फाइलों में, यहां तक कि छोटे लोगों को रखने के लिए झुका रहा हूं। –