2011-06-30 6 views
10

मैं isEqual साथ समस्या आ रही है की समानता परीक्षण करते हैं:कैसे मैं दो CLLocations

कोड:

if (currentAnchor isEqual:currentBusiness.getCllLocation)) 
    { 
     do a; 
    } 
    else 
    { 
     do b; 
    } 

currentanchor और currentbusiness.getCllocation हैं स्थानों

लेकिन अगर वे कर रहे हैं वही, फ़ंक्शन बी क्यों कहा जाता है? क्या मेरे कोड में कुछ गड़बड़ है?

उत्तर

23

मुझे लगता है कि इन दोनों ऑब्जेक्ट्स के नाम पर आधारित CLLocation प्रकार के हैं।

CLLocation क्या अपने isEqual: विधि करता है पर किसी भी विनिर्देश नहीं है, इसलिए संभव है बस NSObject के कार्यान्वयन, जो केवल वस्तुओं के संकेत दिए गए तुलना इनहेरिट है। यदि आपके पास समान डेटा के साथ दो विशिष्ट वस्तुएं हैं, तो isEqual: कार्यान्वयन NO वापस आ जाएगा। और यदि आपके पास स्थान में थोड़ी भिन्नता के साथ दो अलग-अलग वस्तुएं हैं, तो वे निश्चित रूप से बराबर नहीं होंगे।

स्थान वस्तुओं की तुलना करते समय आप शायद isEqual: नहीं चाहते हैं। इसके बजाय, आप शायद CLLocation पर distanceFromLocation: विधि का उपयोग करना चाहते हैं। ऐसा कुछ बेहतर होगा:

CLLocationDistance distanceThreshold = 2.0; // in meters 
if ([currentAnchor distanceFromLocation:currentBusiness.getCllLocation] < distanceThreshold) 
{ 
    do a; 
} 
else 
{ 
    do b; 
} 
0

isEqual केवल उनकी सामग्री को न केवल वस्तुओं की जांच करें। आपको अपनी खुद की विधि बनाने की आवश्यकता है जहां आप ऑब्जेक्ट के चर का उपयोग करते हैं और उन्हें == ऑपरेटर का उपयोग करके समानता के लिए जांचें।

+0

यह सच नहीं है, isEqual सिर्फ इतना है कि ऐसा करने के लिए माना जाता है, जाँच सामग्री के लिए निर्धारित करें कि दो वस्तुएं बराबर हैं या नहीं। यदि दो गुण समान नहीं हैं तो दो वस्तुएं समान नहीं हैं। –

2

यह थोड़ी देर हो गया है।

मैंने जो किया वह बीजे होमर के समान है। मैं बस इसे जोड़ता हूँ।

@interface CLLocation (equal) 
- (BOOL)isEqual:(CLLocation *)other; 
@end 

@implementation CLLocation (equal) 

- (BOOL)isEqual:(CLLocation *)other { 


    if ([self distanceFromLocation:other] ==0) 
    { 
     return true; 
    } 
    return false; 
} 
@end 

मैं मैं इस सवाल :)

+0

मैं इसे 'अन्य' को सुरक्षित रूप से कार्यान्वित करने के लिए 'id' घोषित करने का सुझाव देता हूं – Zerho

+2

समन्वय पर समानता का परीक्षण करने और अन्यथा सुपर वापस करने के लिए यह संभवतः सस्ता है। 'self.coordinate.latitude == other.coordinate.latitude && self.coordinate.longitude == other.coordinate.longitude' – FelixLam

+0

आप किसी श्रेणी में एक विधि ओवरराइड कर रहे हैं। जो एक बुरा अभ्यास है। आपको इस विधि का एक अनिश्चित व्यवहार मिल सकता है। सेब प्रलेखन के अनुसार "यदि किसी वर्ग में घोषित विधि का नाम मूल वर्ग में किसी विधि के समान है, या उसी वर्ग (या यहां तक ​​कि एक सुपरक्लास) पर किसी अन्य श्रेणी में एक विधि है, तो व्यवहार को अपरिभाषित किया गया है रनटाइम पर कौन सी विधि कार्यान्वयन का उपयोग किया जाता है। यदि आप अपनी कक्षाओं के साथ श्रेणियों का उपयोग कर रहे हैं, तो यह एक मुद्दा होने की संभावना कम है, लेकिन मानक कोको या कोको टच कक्षाओं में विधियों को जोड़ने के लिए श्रेणियों का उपयोग करते समय समस्याएं पैदा हो सकती हैं। " –

0

स्विफ्ट 4.0 संस्करण पूछ एक थे हैरान था:

let distanceThreshold = 2.0 // meters 
if location.distance(from: CLLocation.init(latitude: annotation.coordinate.latitude, 
              longitude: annotation.coordinate.longitude)) < distanceThreshold 
{ 
    // do a 
} else { 
    // do b 
} 
संबंधित मुद्दे