मैं कुछ वर्षों से ऑब्जेक्टिव-सी के साथ काम कर रहा हूं, लेकिन मैं अभी भी स्विफ्ट के लिए काफी नया हूं।

वर्तमान में मैं मौजूदा ऑब्जेक्टिव-सी प्रोजेक्ट में कुछ नया स्विफ्ट 5 आधारित कोड जोड़ने के लिए काम कर रहा हूं जो त्रुटि कोड के लिए परिभाषित स्थिरांक और त्रुटियों को फैलाने के लिए NSError ऑब्जेक्ट का उपयोग करता है।

मैं स्विफ्ट में NSError.code का उपयोग कैसे कर सकता हूं?

उद्देश्य-सी कोड:

#define someStrangeError_Code   1000
typedef void(^CompletionHandler)(BOOL success, NSError *error);

...

- (void)doSomethingAsync:(CompletionHandler)completion {
    // ... do something

    if (errorOccured) {
        completion(false, [NSError errorWithDomain:@"MyErrorDomain" code:someStrangeError_Code userInfo:nil])
    } else {
        completion(true, nil)
    }

    ...
}    

[someObjc doSomethingAsync:^(BOOL success, NSError *error) {
    if (error != nil && error.code == someStrangeError_Code) {
        ....
    }
}];

स्विफ्ट कोड:

someObjc.doSomethingAsync(completion: { (success, error) in 
    if ((error as NSError?)?.code == someStrangeError_Code) {
        // ERROR
        // Binary operator '==' cannot be applied to operands of type 'Int?' and 'Int32'
    }
})

मुझे पता है कि स्विफ्ट NSError के बजाय Error प्रोटोकॉल का उपयोग करती है। हालांकि, NSError Error का अनुपालन करता है और इस प्रकार NSError का उपयोग करना कोई समस्या नहीं होनी चाहिए, है ना?

एक साधारण त्रुटि कोड की तुलना स्थिरांक से करना इतना कठिन नहीं होना चाहिए, लेकिन मैं इसे हल नहीं कर सका।

तो बचने के लिए त्रुटि कोड a की जाँच करने का सही "तेज़ तरीका" क्या है

बाइनरी ऑपरेटर '==' को 'इंट?' प्रकार के ऑपरेंड पर लागू नहीं किया जा सकता है। और 'इंट 32'

3
Andrei Herford 10 जुलाई 2019, 15:28

1 उत्तर

सबसे बढ़िया उत्तर

स्विफ्ट में C पूर्णांकों को Int32 के रूप में आयात किया जाता है, और इसकी तुलना सीधे वैकल्पिक Int? से नहीं की जा सकती। एक रूपांतरण मदद करता है:

if ((error as NSError?)?.code == Int(someStrangeError_Code)) {
    // some strange error
}

वैकल्पिक रूप से, पहले वैकल्पिक त्रुटि को खोल दें:

if let error = error {
    if (error as NSError).code == someStrangeError_Code {
        // some strange error
    } else {
        // some other error
    }
} else {
    // no error
}

फिर भी एक अन्य विकल्प (उद्देश्य-)सी परिभाषा को बदलने के लिए है

#define someStrangeError_Code   1000L

एक long int स्थिरांक के लिए, जिसे स्विफ्ट में Int के रूप में आयात किया जाता है। तब आपका मूल स्विफ्ट कोड फिर से संकलित होगा।

3
Martin R 10 जुलाई 2019, 16:17