2014-09-28 5 views
18

एक उद्देश्य सी आधार वर्ग होने से ऑब्जेक्टिव-सी आधार वर्ग के उदाहरण चर तक पहुंचना:एक स्विफ्ट वर्ग

@interface ObjcClass : NSObject { 
    NSString *aVariable_; 
} 

और एक तेज उप-वर्ग:

class SwiftClass : ObjcClass { 
    func init() { 
     // aVariable_ can't be accessed here. An Objective-c derived 
     // class has direct access to it's super's instance variables! 
    } 
} 

मैं कैसे से ObjcClassaVariable_ का उपयोग करते हैं SwiftClass के भीतर?

उत्तर

5

मुझे ऐसा करने का "उचित" तरीका नहीं मिला, लेकिन मुझे इसके लिए काम करने के लिए बुरी तरह की आवश्यकता थी।

हेडर फाइल

@interface ObjcClass : NSObject { 
    NSString *myVariable; 
} 
- (NSString *)getMyVariable; 


कार्यान्वयन फ़ाइल

- (NSString *)getMyVariable { 
    return myVariable; 
} 

मैं में: मेरा समाधान इस तरह मेरी उद्देश्य सी सुपर क्लास में एक साधारण गेटर विधि बनाने के लिए किया गया था, इसे करने का बेहतर तरीका सुनने के लिए प्यार है, लेकिन यह कम से कम काम करता है।

+1

मैं संज्ञा प्रपत्र 'सुझाव है - (NSString *) myVariable'। प्रति सम्मेलन में, "प्राप्त करें" उपसर्ग आमतौर पर संदर्भ द्वारा लौटाए जाने पर उपयोग किया जाता है (उदा। 'एनएसएआरएआरए' '(शून्य) प्राप्त करें ऑब्जेक्ट्स: (आईडी []) बफर रेंज: (एनएसआरेंज) रेंज')। बेहतर अभी भी, एक संपत्ति का उपयोग करें क्योंकि अन्य उत्तरों से पता चलता है। –

17

ग्रेट क्वेरी। हमने इसे पूरा करने के लिए कड़ी मेहनत की है। केवल काम कर समाधान मैं self.valueForKey("aVariable_")

सेट self.setValue("New Value", forKey: "aVariable_")

आशा है कि मदद करता है का उपयोग कर मान का उपयोग करके

प्राप्त मूल्य मिल गया। सुपर क्लास को बदलने के बिना संभावित समाधान।

+0

यही मैंने किया था। मुझे हालांकि @ जेसन टायलर का जवाब पसंद है। – Shai

+0

धन्यवाद @ नरेन्द्र मेरे लिए मैं इस तरह से पसंद करता हूं अगर var aVar = self.valueForKey ("aVariable_") जैसे कि आपका कोड स्विफ्ट में है और आप एक उद्देश्य सी लाइब्रेरी का उपयोग करते हैं जिसे आप संशोधित नहीं कर सकते। बहुत अच्छा काम करता है। – Dam

+0

यह सबसे आसान तरीका है, यहां तक ​​कि यह प्रकार की जांच की झील भी है। –

3

मैंने इसके लिए बहुत कुछ खोजा है।

@interface PrjRec : NSObject { 
    @public 
    NSString* name; 
} 
@end 

करने के लिए::

@interface PrjRec : NSObject { 
} 

@property NSString* name; 

@end 

@JasonTyler समाधान के लिए इसी तरह आखिरकार मैंने अपने कोड बदल दिया है। तब मैं सरल डॉट नोटेशन <object instance>.name साथ स्विफ्ट कोड से मेरी वस्तु संपत्ति के लिए उपयोग कर सकते हैं,

लेकिन मैं से सभी मौजूदा उद्देश्य-सी संदर्भ बदलना करने के लिए आवश्यक

<object instance>->name 

करने के लिए:

<object instance>.name 

या

_name 

यदि कक्षा इकाई के अंदर।

मुझे भी एक बेहतर समाधान की उम्मीद है।

0

यदि आप कोई संपत्ति रखने के इच्छुक हैं, तो आप अपनी आवश्यकताओं के अनुरूप संपत्ति बना सकते हैं।

@interface ObjcClass : NSObject { 
    NSString *aVariable_; 
} 

@property (nonatomic) NSString *aVariable_; 

...

@implementation ObjcClass 

@synthesize aVariable_ = aVariable_; 

यह अनुमति देता है चर inst->aVariable_ के रूप में या inst.aVariable_ के रूप में पहुँचा जा करने के लिए। उद्देश्य सी कक्षा में चर को aVariable_ या self.aVariable_ के रूप में उपयोग किया जा सकता है।

0

मुझे गंभीरता से पता नहीं है कि कोई भी इंस्टेंस चर अब क्यों करता है (एक के लिए, वे डिफ़ॉल्ट रूप से निजी होते हैं) बनाम गुण। इस पर जियोर्जियो कैल्ज़ोलेटो का जवाब देखें (एक बेहतर समाधान की तलाश करने के बारे में उनकी आखिरी पंक्ति के अलावा - यह सबसे अच्छा समाधान है :))।

मेरे मामले में मेरे पास पहले से ही एक संपत्ति थी और यह अतिरिक्त काम नहीं कर रहा था कि यह क्यों काम नहीं कर रहा था। लेकिन मुझे एहसास हुआ कि संपत्ति का एक कस्टम समय था और इसे मेरे एसडीके-ब्रिजिंग-हेडर एच फ़ाइल में जोड़ा जाना आवश्यक था।

तो अपनी संपत्ति इस तरह एक कस्टम प्रकार पर सेट है:

@property (nonatomic, weak) IBOutlet SDKMyCustomObject *customObject; 

... तो ब्रिजिंग हैडर में जोड़ने के लिए याद है।

1

यह मेरे लिए एक बहुत साफ समाधान के रूप में काम किया है, जैसे एक स्विफ्ट चर जोड़ने:

var myInstanceVar: String { 
    return self.value(forKey: "myInstanceVar") as! String 
} 
संबंधित मुद्दे