Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中类枚举的Objective-C错误处理_Objective C_Swift_Error Handling_Enums - Fatal编程技术网

Swift中类枚举的Objective-C错误处理

Swift中类枚举的Objective-C错误处理,objective-c,swift,error-handling,enums,Objective C,Swift,Error Handling,Enums,我刚刚熟悉Objective-C,因为我的主要语言是Swift。我无法找到使用Objective-c枚举处理错误案例的最佳方法,因为我可以使用Swift进行同样的操作 例如,在Swift中,我可以使用方便的枚举处理错误,如下所示: import Foundation public enum ErrorCases: Error, LocalizedError { case invalidURL(String) case JSONStringConversionError(Stri

我刚刚熟悉Objective-C,因为我的主要语言是Swift。我无法找到使用Objective-c枚举处理错误案例的最佳方法,因为我可以使用Swift进行同样的操作

例如,在Swift中,我可以使用方便的枚举处理错误,如下所示:

import Foundation

public enum ErrorCases: Error, LocalizedError {
    case invalidURL(String)
    case JSONStringConversionError(String)
    case JSONStringifyError(Any?)
    case hashArrayCastError(Any)

    public var localizedDescription: String {
        switch self {
        case .invalidURL(let url): return "Invalid URL: \(url)."
        case .JSONStringConversionError(let jsonString): return "Cannot convert string to JSON, string: \(jsonString)."
        case .JSONStringifyError(let data): return "Cannot stringify JSON dictionary with 'Any' data to a string, data: \(String(describing: data))."
        case .hashArrayCastError(let hashArray): return "Cannot cast JSON with '#' key to an arrray of 'Any' objects from massage, JSON: \(hashArray)."
        }
    }
}
if error != nil {
    self.onError(error: ErrorCases.invalidURL(self.mUrl))
}
现在我可以这样使用枚举:

import Foundation

public enum ErrorCases: Error, LocalizedError {
    case invalidURL(String)
    case JSONStringConversionError(String)
    case JSONStringifyError(Any?)
    case hashArrayCastError(Any)

    public var localizedDescription: String {
        switch self {
        case .invalidURL(let url): return "Invalid URL: \(url)."
        case .JSONStringConversionError(let jsonString): return "Cannot convert string to JSON, string: \(jsonString)."
        case .JSONStringifyError(let data): return "Cannot stringify JSON dictionary with 'Any' data to a string, data: \(String(describing: data))."
        case .hashArrayCastError(let hashArray): return "Cannot cast JSON with '#' key to an arrray of 'Any' objects from massage, JSON: \(hashArray)."
        }
    }
}
if error != nil {
    self.onError(error: ErrorCases.invalidURL(self.mUrl))
}
您能否推荐更好的方法来实现相同的错误处理,但使用Objective-C!
谢谢您的帮助。

我能想到的更好的解决方案是:

ErrorCase.h

typedef NS_ENUM(NSInteger, ErrorCaseType) {
    ErrorCaseTypeInvalidURL,
    ErrorCaseTypeJSONStringConversionError,
    ErrorCaseTypeJSONStringifyError,
    ErrorCaseTypeHashArrayCastError
};

@interface ErrorCase : NSObject

@property (readonly, assign) ErrorCaseType errorType;
@property (readonly, assign) NSString *URL;
@property (readonly, assign) NSString *jsonString;
@property (readonly, assign) id data;
@property (readonly, assign) id hashArray;

+ (instancetype) InvalidURL:(NSString *)URL;
+ (instancetype) JSONStringConversionError:(NSString *)jsonString;
+ (instancetype) JSONStringifyError:(id)data;
+ (instancetype) HashArrayCastError:(id)hashArray;

@end
ErrorCase.m

@interface ErrorCase ()

@property (readwrite, assign) ErrorCaseType errorType;
@property (readwrite, assign) NSString *URL;
@property (readwrite, assign) NSString *jsonString;
@property (readwrite, assign) id data;
@property (readwrite, assign) id hashArray;

@end

@implementation ErrorCase

+ (instancetype) InvalidURL:(NSString *)URL {
    ErrorCase *error = [[ErrorCase alloc] init];
    error.URL = URL;
    error.errorType = ErrorCaseTypeInvalidURL;
    return error;
}

+ (instancetype) JSONStringConversionError:(NSString *)jsonString {
    ErrorCase *error = [[ErrorCase alloc] init];
    error.jsonString = jsonString;
    error.errorType = ErrorCaseTypeJSONStringConversionError;
    return error;
}

+ (instancetype) JSONStringifyError:(id)data {
    ErrorCase *error = [[ErrorCase alloc] init];
    error.data = data;
    error.errorType = ErrorCaseTypeJSONStringifyError;
    return error;
}

+ (instancetype) HashArrayCastError:(id)hashArray {
    ErrorCase *error = [[ErrorCase alloc] init];
    error.hashArray = hashArray;
    error.errorType = ErrorCaseTypeHashArrayCastError;
    return error;
}

@end
你可以这样使用它

ErrorCase *errorCase = [ErrorCase InvalidURL:@"https://example.com"];

switch (errorCase.errorType) {
    case ErrorCaseTypeInvalidURL: NSLog(@"Invalid URL %@", errorCase.URL); break;
    case ErrorCaseTypeJSONStringConversionError: NSLog(@"Conversion Error %@", errorCase.jsonString); break;
    case ErrorCaseTypeJSONStringifyError: NSLog(@"Stringify Error %@", errorCase.data); break;
    case ErrorCaseTypeHashArrayCastError: NSLog(@"Cast Error %@", errorCase.hashArray); break;
}

在objC中,您不能真正执行与枚举不能具有关联值相同的操作。 objC中的错误处理主要是通过NSError对象完成的。 在您的情况下,我建议创建枚举:

typedef NS_ENUM(NSInteger, ErrorCaseType) {
    ErrorCaseTypeInvalidURL,
    ErrorCaseTypeJSONStringConversionError,
    ErrorCaseTypeJSONStringifyError,
    ErrorCaseTypeHashArrayCastError
};
然后在出现错误时,创建一个错误对象:

error = [NSError errorWithDomain:@"com.myapp.mydomain" 
                                code: ErrorCaseTypeInvalidURL
                            userInfo:@{NSLocalizedDescriptionKey : NSLocalizedString(@"Oops...", nil)}];
当接收到错误时,您可以访问
[error code]
值,并对照您的枚举进行检查或/和显示
[error localizedDescription]
文本

您可以在此处找到有关错误对象的更多信息:

它在实现中可能看起来很难看,但界面并没有那么糟糕。除非你真的非常清楚自己在做什么,否则不要对对象使用
assign
properties!正如@clemens所说,这些可能会导致指针悬空。字符串的值都应该是
copy
id
的值应该是
strong
retain