Цикл по элементам и ожидание, пока все элементы не будут проверены до успеха Swift - PullRequest
0 голосов
/ 20 июня 2020

У меня есть forL oop, который перебирает элементы в массиве textField и проверяет, заполнены ли все поля, иначе возврат. Проблема, которая у меня есть по умолчанию, состоит в том, что 3 из 4 элементов в массиве предварительно заполнены, поэтому в первом случае первый элемент является незаполненным, и функция прерывается, но как только я делаю элемент во втором пустым и заполняю во-первых, он сначала запускает true, а затем повторно запускает проверку, которая равна false, как бы то ни было, проверка проверяется. Как я могу предотвратить вызов закрытия true до тех пор, пока все пункты не будут рассмотрены.

private func formArrayValidation(completion: @escaping (Bool, [String: Any]?) -> Void) {
        guard self.pageThree.formArray.count > 0 else {
            return
        }
        for form in self.pageThree.formArray {
            
            guard form.textField.text != "" else {
                SPAlert.present(message: "\(form.dynamicModel?.name ?? "") is required", haptic: .error)
                completion(false, nil)
                break
            }
            
            guard Regex.validateDynamicForm(form.textField.text ?? "", pattern: form.dynamicModel?.pattern ?? "") else {
                SPAlert.present(message: "\(form.textField.text ?? "") does not match our pattern", haptic: .error)
                completion(false, nil)
                break
            }
            guard let key = form.dynamicModel?.key, let value = form.textField.text else { return }
            inputParameter[key] = value
            self.applicationParameter["inputs"] = inputParameter
            completion(true, applicationParameter)
        }
        
    }

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Основываясь на предыдущем решении, вы можете сделать следующее:

private func formArrayValidation(completion: @escaping (Bool, [String: Any]?) -> Void) {
    var isValidated = false
    guard !self.pageThree.formArray.isEmpty else {
        completion(isValidated, nil)
        return
    }

    for form in self.pageThree.formArray {
        guard !form.textField.text.isEmpty else {
            SPAlert.present(message: "\(form.dynamicModel?.name ?? "") is required", haptic: .error)
            isValidated = false
            break
        }
        
        guard Regex.validateDynamicForm(form.textField.text ?? "", pattern: form.dynamicModel?.pattern ?? "") else {
            SPAlert.present(message: "\(form.textField.text ?? "") does not match our pattern", haptic: .error)
            isValidated = false
            break
        }

        guard let key = form.dynamicModel?.key, let value = form.textField.text else { 
        isValidated = false
        return
        }
        inputParameter[key] = value
        self.applicationParameter["inputs"] = inputParameter
        isValidated = true
    }

    completion(isValidated, applicationParameter)
    
}
0 голосов
/ 20 июня 2020

Вы должны вызвать completion(true) строку после l oop, потому что все формы должны пройти тесты.

И заменить break на return для немедленного возврата

private func formArrayValidation(completion: @escaping (Bool, [String: Any]?) -> Void) {
    guard !self.pageThree.formArray.isEmpty else {
        return
    }
    for form in self.pageThree.formArray {
        
        guard !form.textField.text.isEmpty else {
            SPAlert.present(message: "\(form.dynamicModel?.name ?? "") is required", haptic: .error)
            completion(false, nil)
            return
        }
        
        guard Regex.validateDynamicForm(form.textField.text ?? "", pattern: form.dynamicModel?.pattern ?? "") else {
            SPAlert.present(message: "\(form.textField.text ?? "") does not match our pattern", haptic: .error)
            completion(false, nil)
            return
        }
        guard let key = form.dynamicModel?.key, let value = form.textField.text else { return }
        inputParameter[key] = value
        self.applicationParameter["inputs"] = inputParameter
    }
    completion(true, applicationParameter)
    
}

Примечание. Проверяйте, являются ли типы коллекций и строки пустыми, всегда с помощью isEmpty, а не count > 0 или != ""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...