如何在swift中验证struct属性

时间:2018-04-18 15:59:20

标签: swift validation struct properties

我有一个结构,

struct State { 
  let email: String
  let phoneNumber: String
}

我从上一个类传递此值,如

 class.State(email: "email", phoneNumber: "021000000")

现在,我将这些分配给文本字段,如果用户编辑,则在shouldChangeCharactersIn中完成验证。

我想在struct for email和phoneNumber中进行验证 并使用闭包返回结果。 (因为只有在属性有效时才会将此更新的结构传递给其他类以启用我的按钮。)

我无法在我的struct中调用验证方法。

如何在struct中验证struct属性或访问类方法?我走向正确的方向,我很困惑?

2 个答案:

答案 0 :(得分:0)

的方法:

  1. 跟踪正在编辑的字段/ indbexpath
  2. 当字符发生变化时,请执行以下操作:
    • 更新模型中的相关字段
    • 进行验证
    • 根据验证结果,执行一些操作,例如启用/禁用完成按钮
  3. 代码:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        let existingText = textField.text as NSString?
    
        let changedText = existingText?.replacingCharacters(in: range, with: string)
    
        update(withChangedText: changedText) //Update model and do your validation, example enable / disable Done button 
    
        return true
    }
    

答案 1 :(得分:0)

由于结构的两个字段都是不可变的,因此您只需在结构的初始值设定项中进行验证即可。您应该创建一个可用的初始化程序,如果验证失败,它将失败。

struct State {
    let email: String
    let phoneNumber: String

    init?(email:String,phoneNumber:String) {
        //Do your own validation here
        if (email.contains("@") && phoneNumber.count == 9){
            self.email = email
            self.phoneNumber = phoneNumber
        } else {
            return nil
        }
    }
}

State(email: "a@b.com", phoneNumber: "123456789") // creates a State instance
State(email: "ab.com", phoneNumber: "123") //nil

您可以通过将用户输入作为输入参数提供给shouldChangeCharactersIn的初始化程序并检查返回值是否为State来验证nil中的用户输入。