Swift.優(yōu)雅的String驗(yàn)證方法

使用示例

前言:

我們?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

有問題歡迎探討.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • 第一類 人山人海型 你能想象人多到什么程度叫人山人海? 下面我們來細(xì)節(jié)幾個(gè)場景。 一。你準(zhǔn)備排隊(duì),還沒站定,有一個(gè)...
    丑小鴨進(jìn)化論閱讀 334評論 0 0
  • 懷著激動(dòng)的心情,滿懷欣喜的迎來了端午節(jié)假期,再加上生活中事情處理完畢,和朋友約好長城走起,附帶周邊策馬奔騰!~ 從...
    楊帥閱讀 444評論 0 1
  • 今天是第19天,周六中秋放假第二天。 早晨跟著家人們一起吃飯,沖了一袋鈣奶,吃了20片左右松花粉。 因?yàn)樯ぷ硬皇娣?..
    甲坤閱讀 496評論 0 0
  • 在操作系統(tǒng)中,線程是操作系統(tǒng)調(diào)度的最小單位,同時(shí)線程又是一種受限的系統(tǒng)資源,即線程不可能無限地產(chǎn)生,并且線程的創(chuàng)建...
    南柯夢夏閱讀 369評論 0 0

友情鏈接更多精彩內(nèi)容