Функция ViewModel: не может присваивать значение: 'error' является константой 'let'

Я бы предложил вам взглянуть на Modernizr . Это небольшая небольшая библиотека, в которую вы можете асинхронно загружать свой javascript с функциями, которые позволяют вам проверить, загружен ли файл, и выполнить сценарий в другом, указанном вами.

Вот пример загрузки jquery:

Modernizr.load([
  {
    load: '//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js',
    complete: function () {
      if ( !window.jQuery ) {
            Modernizr.load('js/libs/jquery-1.6.1.min.js');
      }
    }
  },
  {
    // This will wait for the fallback to load and
    // execute if it needs to.
    load: 'needs-jQuery.js'
  }
]);

0
задан Sharad Chauhan 13 July 2018 в 06:54
поделиться

8 ответов

Я не совсем уверен, что вы пытаетесь сделать с SingUpError (вы имеете в виду SignUpError?), но это моя попытка. В основном я перемещаю перечисление из func, и я делаю func возвратом String

class SingUpError  {
    enum ErrorMessage: String {
        case noName = "Name cannot be empty"
        case noLastName = "Last name cannot be empty"
        case noEmail = "Email cannot be empty"
        case noPassword = "Password cannot be empty"
    }

    func errorMessage(name: String?, lastName: String?,email: String?, password: String?) -> String? {
        var message: String?

        if name == nil || name.isEmpty {
            message = ErrorMessage.noName.rawValue
        } //else if lastName...

        return message
    }
}

, а затем в submitData

if let error = vm.errorMessage(name: name, lastName: lastName, email: email, password: password) {
     nameErrLbl.text = error
}
0
ответ дан Joakim Danielson 17 August 2018 в 13:31
поделиться

Во-первых, поместите это перечисление из класса SignUpError

enum ErrorMessage: String {
        case noName = "Name cannot be empty"
        case noLastName = "Last name cannot be empty"
        case noEmail = "Email cannot be empty"
        case noPassword = "Password cannot be empty"
    }

, во-вторых, вы можете изменить свою функцию следующим образом:

func errorMessage(name: String?, lastName: String?,email: String?, password: String?) -> String? {
    if name == "" {
        let error = ErrorMessage.noName.rawValue
        return error
    }
    return nil
}

Теперь в вашем ViewController вы можете измените свою функцию, чтобы получить errorMessage, как это

func submitData() {
    //YOUR EXISTING CODE HERE    
    if let errorMessage = vm.errorMessage(name: name, lastName: lastName, email: email, password: password) {
        print("errorMessage:\(errorMessage)")
        return
    }
}

ИЛИ Вы можете попробовать тот же подход, который у вас есть, но передавая ошибку как параметр inout. аналогичный вопрос здесь

0
ответ дан Bhavin Kansagara 17 August 2018 в 13:31
поделиться

Если вы хотите использовать тот же подход, который вы использовали, вам нужно изменить какую-то второстепенную вещь в вашей функции.

Параметр функции первой вещи означает, что константа означает, что вы не можете присвоить значение, но если вам все еще нужно для присвоения некоторого значения вашему параметру, тогда будет один способ использования ключевого слова inout в функции

class SingUpError {
    func errorMessage(name: String?, lastName: String?,email: String?, password: String?, error: inout String?){

        enum ErrorMessage: String {
            case noName = "Name cannot be empty"
            case noLastName = "Last name cannot be empty"
            case noEmail = "Email cannot be empty"
            case noPassword = "Password cannot be empty"
        }

        if name == "" {
            error = ErrorMessage.noName.rawValue
        }
    }
}

, вызывающего

vm.errorMessage(name: name, lastName: lastName, email: email, password: password, error: &nameErrLbl.text)

. Также есть ссылка на ссылку

Когда использовать inout параметры?

0
ответ дан chirag shah 17 August 2018 в 13:31
поделиться
class SingUpError {
    func errorMessage(name: String?, lastName: String?,email: String?, password: String?) -> String? {

        guard let _ = name else { return ErrorMessage.noName.rawValue }

        // <this seems incomplete, but..>
        enum ErrorMessage: String { 
            case noName = "Name cannot be empty"
            case noLastName = "Last name cannot be empty"
            case noEmail = "Email cannot be empty"
            case noPassword = "Password cannot be empty"
        }

        return nil
    }
}
0
ответ дан Chris Conover 17 August 2018 в 13:31
поделиться

Вы пытаетесь присвоить значение константе.

Вы не можете этого сделать, потому что error это параметр функции. Если вы хотите получить сообщение об ошибке этой функции, вам нужно написать что-то вроде:

return ErrorMessage.noName.rawValue

вместо

error = ErrorMessage.noName.rawValue
0
ответ дан Evsenev 17 August 2018 в 13:31
поделиться

Когда вы объявляете функцию в swift, ее параметры по умолчанию имеют константы «let». И мы не можем присваивать значение константам.

В вашем случае вы пытаетесь присвоить переменной «error», которая является параметром, следовательно, константой (let). Вы не можете сделать это.

Вы можете вернуть сообщение об ошибке

class SingUpError {
    func errorMessage(name: String?, lastName: String?,email: String?, password: String?) -> String{

        enum ErrorMessage: String {
            case noName = "Name cannot be empty"
            case noLastName = "Last name cannot be empty"
            case noEmail = "Email cannot be empty"
            case noPassword = "Password cannot be empty"
        }

        if name == "" {
            return ErrorMessage.noName.rawValue
        }

        return ""
    }
}
0
ответ дан Hardik Thakkar 17 August 2018 в 13:31
поделиться
  • 1
    возвратная строка требуется, в противном случае она дает ошибку & quot; Отсутствует возврат в функции, ожидаемой возвращать String & quot; – Hardik Thakkar 13 July 2018 в 07:08
  • 2
    Да это верно. Нам нужно вернуть строку. Спасибо, что указали это. – varsim 13 July 2018 в 07:12

Как и другие ответы, вы не можете назначить параметр «error», потому что это константа (допустимая переменная, если вы это сделаете). Теперь вы можете спуститься по пути модификации функции, чтобы вернуться в качестве строки, как было предложено, но вам было бы лучше использовать более структурированный подход и фактически выбросить ошибку.

Что-то вроде этого:

enum sumbissionErrors: Error {
    case noName
    case noLastName
    case noEmail
    case noPassword

    var description: String {
        switch self {
        case .noName:
            return "Name cannot be empty"
        case .noLastName:
            return "Last name cannot be empty"
        case .noEmail:
            return "Email cannot be empty"
        case .noPassword:
            return "Password cannot be empty"
        }
    }
}

func submitData() throws {
    if nameText.text == nil || nameText.text!.isEmpty {
        throw sumbissionErrors.noName
    }

    if lastNameText.text == nil || lastNameText.text!.isEmpty {
        throw sumbissionErrors.noLastName
    }

    if emailText.text == nil || emailText.text!.isEmpty {
        throw sumbissionErrors.noEmail
    }

    if passwordText.text == nil || passwordText.text!.isEmpty {
        throw sumbissionErrors.noPassword
    }

    // Do whatever you want now that the data is valid.
}

@IBAction func submitButton(_ sender: UIButton) {
    do {
        try submitData()
    }
    catch {
        if let sumbmissionError = error as? sumbissionErrors {
            switch sumbmissionError {
            case .noName:
                nameErrLbl.text = sumbmissionError.description
            case .noLastName:
                lastNameErrLbl.text = sumbmissionError.description
            case .noEmail:
                emailErrLbl.text = sumbmissionError.description
            case .noPassword:
                passwordErrLbl.text = sumbmissionError.description
            }
        } else {
            // This will probably never happen but it indicates that some other more general error occured and needs to be handled here.
        }
    }
}

Это всего лишь пример, и, как и ваш оригинал, он будет только бросать первую ошибку, с которой он сталкивается. Возможно, вы захотите переструктурировать все, чтобы можно было пометить несколько ошибок. То есть возможно, что более одного из них могут быть пустыми.

0
ответ дан Upholder Of Truth 17 August 2018 в 13:31
поделиться
0
ответ дан Hardik Thakkar 6 September 2018 в 09:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: