ऑब्जेक्टिव-सी में, जावा के "इंस्टोफ" कीवर्ड के बराबर क्या है?


185

मैं यह जांचना चाहूंगा कि क्या कोई वस्तु (जैसे someObject) किसी अन्य प्रकार (जैसे SpecifiedType) के एक चर के लिए असाइन करने योग्य (कास्ट-सक्षम) है या नहीं । जावा में, मैं लिख सकता हूं:

someObject instanceof SpecifiedType

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

someObject.getClass().equals(SpecifiedType.class)

यह उद्देश्य-सी में कैसे किया जा सकता है?


जवाबों:


264

[myObject class]किसी वस्तु का वर्ग लौटाने का प्रयास करें ।

आप के साथ सटीक तुलना कर सकते हैं:

if ([myObject class] == [MyClass class])

लेकिन सीधे MyClassपहचानकर्ता का उपयोग करके नहीं ।

इसी तरह, आप पा सकते हैं कि क्या वस्तु आपके वर्ग के उपवर्ग के साथ है:

if ([myObject isKindOfClass:[AnObject class]])

जॉन स्कीट और ज़ूल द्वारा सुझाए गए अनुसार।


मैं उदाहरण के लिए "AnObject" प्रकार की वस्तु के साथ समानता की जांच कैसे करूंगा?
दिमित्रिस

"if ([myObject class] == [AnObject class])" या, जैसा कि जॉन स्कीट और zoul द्वारा सुझाया गया है: "अगर ([myObject isKindOfClass: [AnObject class]]]"
mouviciel

8
सटीक तुलना भी की जा सकती हैif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

से विकिपीडिया :

उद्देश्य-सी में, उदाहरण के लिए, जेनेरिक Objectऔर NSObject(कोको / ओपनस्टेप में) दोनों विधि प्रदान करते हैं isMemberOfClass:जो कि रिटर्न देता है trueयदि विधि का तर्क निर्दिष्ट वर्ग का एक उदाहरण है। isKindOfClass:यदि तर्क निर्दिष्ट वर्ग से विरासत में मिलता है, तो यह पद्धति समान रूप से सही है।

isKindOfClass:के नाद से सबसे नजदीक होगा instanceof


9

देखें : isKindOfClass में विधि NSObject प्रलेखन। (इस तरह के प्रश्न के लिए चेतावनी का सामान्य शब्द यह है कि ऑब्जेक्ट क्लास की जांच करना अक्सर कुछ गलत करने का संकेत है।)


2
बस नीचे दिए गए "उत्तर" से नकल करते हुए: "@Zoul - कक्षा प्रकार की जाँच को बुरा क्यों माना जाता है? क्या यह अच्छी रक्षात्मक प्रोग्रामिंग नहीं है या आप तर्क दे रहे हैं कि यह अनावश्यक होना चाहिए?"
दान रोसेनस्टार्क

1
अहा, धन्यवाद। एक समस्या यह है कि वस्तुओं को उस वर्ग का नहीं होना चाहिए जिसकी आप अपेक्षा कर रहे हैं। परीक्षण के दौरान इंटरफ़ेस को सम्मानित करने वाले क्लास स्टब को पारित करना काफी सामान्य है, लेकिन एक अलग वर्ग है। या जब आप केवीओ का उपयोग करके मूल्य परिवर्तनों का निरीक्षण करते हैं तो कक्षाओं के साथ कुछ जादू होता है। यदि आपका कोड स्पष्ट श्रेणी की जाँच करता है तो दोनों मामले काफी वैध हैं और दोनों आसानी से टूट जाते हैं। कक्षा में स्विचिंग व्यवहार खराब ओओ डिजाइन, कसकर युग्मित और विस्तार करने के लिए कठिन है। मैं यह नहीं कह रहा हूँ कि कक्षा की जाँच के लिए कोई वैध उपयोग मामला नहीं है, लेकिन आपको इसे करने से पहले दो बार सोचना चाहिए।
18

@ ज़ूल उस विशिष्ट मामले में यह सिर्फ सादा अनुभवहीनता होगी, एक और अधिक उपयोग की संभावना होगी + (BOOL)conformsToProtocol:(Protocol *)aProtocol
एरिकलैफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.