Я бы предложил вам взглянуть на 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'
}
]);
Я не совсем уверен, что вы пытаетесь сделать с 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
}
Во-первых, поместите это перечисление из класса 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. аналогичный вопрос здесь
Если вы хотите использовать тот же подход, который вы использовали, вам нужно изменить какую-то второстепенную вещь в вашей функции.
Параметр функции первой вещи означает, что константа означает, что вы не можете присвоить значение, но если вам все еще нужно для присвоения некоторого значения вашему параметру, тогда будет один способ использования ключевого слова 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)
. Также есть ссылка на ссылку
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
}
}
Вы пытаетесь присвоить значение константе.
Вы не можете этого сделать, потому что error
это параметр функции. Если вы хотите получить сообщение об ошибке этой функции, вам нужно написать что-то вроде:
return ErrorMessage.noName.rawValue
вместо
error = ErrorMessage.noName.rawValue
Когда вы объявляете функцию в 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 ""
}
}
Как и другие ответы, вы не можете назначить параметр «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.
}
}
}
Это всего лишь пример, и, как и ваш оригинал, он будет только бросать первую ошибку, с которой он сталкивается. Возможно, вы захотите переструктурировать все, чтобы можно было пометить несколько ошибок. То есть возможно, что более одного из них могут быть пустыми.