NSError的应用在实际开发中也是经常会接触到的,这是我在做登录界面的时候,我希望输入框输入完成后即刻判断输入是否正确,如果输入错误需要显示错误信息。
也想过用一个block里边装个数组@[BOOL,NSString]这样来完成需求,其实也是可以的。不过何不用用NSError呢?
下边我贴出了我定义的CheckManger(信息检测类):
在manager的头文件中
#import <Foundation/Foundation.h>
typedef void(^completed)(BOOL isCorrect, NSError *error);
@interface LLCheckManager : NSObject
/**验证手机号码是否正确*/
+ (void)checkPhoneNumber:(NSString *)phoneNumString completed:(completed) completed;
/**验证邮箱是否输入正确*/
+ (void)checkEmail:(NSString *)emailString completed:(completed)completed;
/**验证密码是否正确*/
+ (void)checkPassworld:(NSString *)passwordString completed:(completed)completed;
@end
在manager的m文件中:
首先需要知道NSError的构建参数,
1.domain:—— 错误域 (自定义,作用我不是很清楚暂且理解为提示作用吧)
2.code: —— 错误编码(自己定义,编码应当与错误内容匹配,相当于看到404就知道是访问不了)
3.userInfo:——错误原因(自己定义,给出错误的原因)
具体信息且看代码:
#import "LLCheckManager.h"
#define LLErrorDomain @" An Error Has Occurred"
typedef enum {
LLErrorDefult = 0,
LLErrorConnect ,
LLErrorNotFind,
LLErrorMatch
}LLErrorFailed;
@implementation LLCheckManager
#pragma mark —— 定义错误
/**返回一个错误*/
+ (NSError *)errorWithCode:(LLErrorFailed)code{
NSString * localizedDescription;
switch (code) {
case LLErrorConnect:
localizedDescription = @"网络链接错误";
break;
case LLErrorNotFind:
localizedDescription = @"没有找到";
break;
case LLErrorMatch:
localizedDescription = @"匹配错误";
break;
default:
localizedDescription = @"输入错误";
break;
}
NSDictionary * userInfo = [NSDictionary dictionaryWithObject:localizedDescription forKey:NSLocalizedDescriptionKey];
NSError * aError = [NSError errorWithDomain:LLErrorDomain code:code userInfo:userInfo];
return aError;
}
#pragma mark —— 验证
/**验证手机号码*/
+ (void)checkPhoneNumber:(NSString *)phoneNumString completed:(completed)completed{
NSString *phoneNumFormat = @"^1[2|3|4|5|6|7|8][0-9]{9}$";
//表示字符串以1开头,紧接着是2、3、4、5、6、7、8中的任意一个,然后是0~9中的数字 以9个 结尾。
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneNumFormat];
BOOL isMatch = [pred evaluateWithObject:phoneNumString];
completed(isMatch,[self errorWithCode:LLErrorDefult]);
}
//验证邮箱
+ (void)checkEmail:(NSString *)emailString completed:(completed)completed{
NSString * emailFormat = @"^(([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]";
NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailFormat];
BOOL isMatch = [pred evaluateWithObject:emailString];
completed(isMatch,[self errorWithCode:LLErrorDefult]);
}
/**验证密码*/
+ (void)checkPassworld:(NSString *)passwordString completed:(completed)completed{
NSString *passwordFormat = @"^[A-Za-z0-9]{6,20}+$";
//表示字符串以大写字母 或 小写字母 或 数字 中的6到20个 组成
NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCH %@",passwordFormat];
BOOL isMatch = [pred evaluateWithObject:passwordString];
completed(isMatch,[self errorWithCode:LLErrorDefult]);
}
@end
在ViewController中如何用到error呢?
直接调用方法,和一般的error用法相同
#define mark —— textField Delegate
- (void)textFieldDidEndEditing:(UITextField *)textField{
[LLCheckManager checkPhoneNumber:textField.text completed:^(BOOL isCorrect, NSError *error) {
if (isCorrect) {
NSLog(@"账号输入正确");
}else{
// NSLog(@"%@",error);
NSLog(@"%@",error.localizedDescription);
}
}];
}