
前言:
我們?nèi)粘i_發(fā)工作中,總會(huì)遇到需要用戶輸入的場景,只要有用戶輸入,就需要進(jìn)行準(zhǔn)確性驗(yàn)證,例如輸入是否為空,手機(jī)號(hào)是否符合格式等等.
另外也有需要前端判斷后臺(tái)返回的String是否需要展示等需求.
本身都是不復(fù)雜的功能,我們可以對這個(gè)功能進(jìn)行封裝.來提高我們代碼的可讀性,復(fù)用性和可拓展性.
實(shí)現(xiàn)效果:
優(yōu)雅的實(shí)現(xiàn)通過一個(gè)外部方法驗(yàn)證多個(gè)輸入字符串是否符合設(shè)定規(guī)則.
代碼低耦合,拓展方便,使用方便.
實(shí)現(xiàn)手機(jī)號(hào)正則驗(yàn)證,以及郵箱賬號(hào)正則驗(yàn)證.
實(shí)現(xiàn)方式:
1.添加正則判斷enum
2.添加返回結(jié)果enum
3.創(chuàng)建單個(gè)String驗(yàn)證方法
4.創(chuàng)建外部使用驗(yàn)證方法
1.添加正則判斷enum
這里添加了手機(jī)號(hào),郵箱地址的正則判斷,如果有需要,可以添加類似的正則判斷.例如身份證號(hào)判斷,漢字判斷等等.只需要添加相應(yīng)的block以及對應(yīng)狀態(tài)就可以.
/// 正則驗(yàn)證格式
///
/// - phoneNum: 驗(yàn)證手機(jī)號(hào)格式block
/// - email: 驗(yàn)證郵箱格式block
enum Validate {
///需要拓展可以添加相應(yīng)block以及相應(yīng)狀態(tài),類似身份證等等
case phoneNum(_: String)
case email(_: String)
var isRight: Bool {
///正則表達(dá)式字符串
var predicateStr:String!
///需要驗(yàn)證的字符串
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.添加返回結(jié)果enum
這里定義我們驗(yàn)證的三種結(jié)果
enum VerifyResult {
case ok ///正確
case empty ///為空
case failed(message: String) ///錯(cuò)誤,返回錯(cuò)誤原因
}
3.創(chuàng)建單個(gè)String驗(yàn)證方法
這里寫出兩個(gè)示例,第一個(gè)是手機(jī)號(hào)驗(yàn)證,其中有正則判斷手機(jī)號(hào)是否符合格式,
第二個(gè)是密碼驗(yàn)證,其中有判斷密碼是否在6-12位之內(nèi).
所以我們在使用是,可以根據(jù)自己的實(shí)際需求,來添加不同類型String的不同驗(yàn)證方法
/// 驗(yàn)證手機(jī)號(hào)
///
/// - Parameter phone: 手機(jī)號(hào)
class func verifyPhone(_ phone:String) -> VerifyResult {
guard phone.count != 0 else {
return .empty
}
guard Validate.phoneNum(phone).isRight else {
return .failed(message: "請輸入正確手機(jī)號(hào)")
}
return .ok
}
/// 驗(yàn)證密碼
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.創(chuàng)建外部使用驗(yàn)證方法
這里實(shí)現(xiàn)的是示例圖片使用的方法.按照順序分別調(diào)用單個(gè)String驗(yàn)證方法.并可以添加特定判斷,例如方法中的需要密碼與確認(rèn)密碼一致
/// 驗(yàn)證手機(jī)號(hào),驗(yàn)證碼,密碼,確認(rèn)密碼
///
/// - Parameters:
/// - phone: 手機(jī)號(hào)
/// - code: 驗(yàn)證碼
/// - password: 密碼
/// - passwordSure: 確認(rèn)密碼
/// - Returns: (狀態(tài),原因)
class func verifyInput(phone:String,code:String,password:String,passwordSure:String) -> (Bool,String?) {
switch UserVerifyService.verifyPhone(phone) {
case .empty:
return (false, "請輸入手機(jī)號(hào)")
case .failed(let message):
return (false, message)
default:
break
}
switch UserVerifyService.verifyCode(code) {
case .empty:
return (false,"請輸入驗(yàn)證碼")
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,"請輸入確認(rèn)密碼")
case .failed(let message):
return (false, message)
default:
break
}
guard password == passwordSure else {
return (false,"兩次密碼不一致")
}
return (true, nil)
}
使用方法示例:
將EWUserVerifyService文件拖入項(xiàng)目,調(diào)用時(shí):
if let phone = phoneTextField.text,
let sms = smsTextField.text,
let password = passwordTextField.text,
let passwordSure = passwordSureTextField.text
{
///進(jìn)行判斷
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
有問題歡迎探討.