Swift.优雅的String验证方法
2018-10-11 本文已影响29人
王四猫
![](https://img.haomeiwen.com/i10170278/f2b93047dcef9a98.gif)
前言:
我们日常开发工作中,总会遇到需要用户输入的场景,只要有用户输入,就需要进行准确性验证,例如输入是否为空,手机号是否符合格式等等.
另外也有需要前端判断后台返回的String是否需要展示等需求.
本身都是不复杂的功能,我们可以对这个功能进行封装.来提高我们代码的可读性,复用性和可拓展性.
实现效果:
优雅的实现通过一个外部方法验证多个输入字符串是否符合设定规则.
代码低耦合,拓展方便,使用方便.
实现手机号正则验证,以及邮箱账号正则验证.
实现方式:
1.添加正则判断enum
2.添加返回结果enum
3.创建单个String验证方法
4.创建外部使用验证方法
1.添加正则判断enum
这里添加了手机号,邮箱地址的正则判断,如果有需要,可以添加类似的正则判断.例如身份证号判断,汉字判断等等.只需要添加相应的block以及对应状态就可以.
/// 正则验证格式
///
/// - phoneNum: 验证手机号格式block
/// - email: 验证邮箱格式block
enum Validate {
///需要拓展可以添加相应block以及相应状态,类似身份证等等
case phoneNum(_: String)
case email(_: String)
var isRight: Bool {
///正则表达式字符串
var predicateStr:String!
///需要验证的字符串
var currObject:String!
switch self {
case let .phoneNum(str):
predicateStr = "^1(3|4|5|6|7|8|9)[0-9]\\d{8}$"
currObject = str
case let .email(str):
predicateStr = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$"
currObject = str
}
let predicate = NSPredicate(format: "SELF MATCHES %@" ,predicateStr)
return predicate.evaluate(with: currObject)
}
}
2.添加返回结果enum
这里定义我们验证的三种结果
enum VerifyResult {
case ok ///正确
case empty ///为空
case failed(message: String) ///错误,返回错误原因
}
3.创建单个String验证方法
这里写出两个示例,第一个是手机号验证,其中有正则判断手机号是否符合格式,
第二个是密码验证,其中有判断密码是否在6-12位之内.
所以我们在使用是,可以根据自己的实际需求,来添加不同类型String的不同验证方法
/// 验证手机号
///
/// - Parameter phone: 手机号
class func verifyPhone(_ phone:String) -> VerifyResult {
guard phone.count != 0 else {
return .empty
}
guard Validate.phoneNum(phone).isRight else {
return .failed(message: "请输入正确手机号")
}
return .ok
}
/// 验证密码
class func verifyPassword(_ password:String) -> VerifyResult {
if password.count == 0 {
return .empty
}
if !(password.count >= 6
&& password.count <= 12) {
return .failed(message: "请输入6-12位的密码")
}
return .ok
}
4.创建外部使用验证方法
这里实现的是示例图片使用的方法.按照顺序分别调用单个String验证方法.并可以添加特定判断,例如方法中的需要密码与确认密码一致
/// 验证手机号,验证码,密码,确认密码
///
/// - Parameters:
/// - phone: 手机号
/// - code: 验证码
/// - password: 密码
/// - passwordSure: 确认密码
/// - Returns: (状态,原因)
class func verifyInput(phone:String,code:String,password:String,passwordSure:String) -> (Bool,String?) {
switch UserVerifyService.verifyPhone(phone) {
case .empty:
return (false, "请输入手机号")
case .failed(let message):
return (false, message)
default:
break
}
switch UserVerifyService.verifyCode(code) {
case .empty:
return (false,"请输入验证码")
case .failed(let message):
return (false, message)
default:
break
}
switch UserVerifyService.verifyPassword(password) {
case .empty:
return (false,"请输入密码")
case .failed(let message):
return (false, message)
default:
break
}
switch UserVerifyService.verifyPassword(passwordSure) {
case .empty:
return (false,"请输入确认密码")
case .failed(let message):
return (false, message)
default:
break
}
guard password == passwordSure else {
return (false,"两次密码不一致")
}
return (true, nil)
}
使用方法示例:
将EWUserVerifyService文件拖入项目,调用时:
if let phone = phoneTextField.text,
let sms = smsTextField.text,
let password = passwordTextField.text,
let passwordSure = passwordSureTextField.text
{
///进行判断
let (isVerify, message) = UserVerifyService.verifyInput(phone: phone, code: sms, password: password, passwordSure: passwordSure)
///如果failed
if !isVerify {
///message:失败原因
if let message = message {
EWToast.showCenterWithText(text: message, duration: 1)
}
return
}
}
EWToast.showCenterWithText(text: "全部填写正确", duration: 1)
demo地址:EWJudgmentString
有问题欢迎探讨.