Как я должен обрабатывать быструю проверку параметров

#swift

#swift

Вопрос:

Я изучаю Swift. Я разрабатываю класс, который должен выполнять проверку параметров в своем инициализаторе. Как я должен справиться с этим, если переданное значение выходит за пределы диапазона? Мне действительно трудно найти подходящий способ разработки этого, учитывая, что:

  • Swift не имеет исключений, на языках с исключениями и встроенным механизмом try / catch я бы выдал исключение.
  • Swift не позволяет возвращать nil / null / nothing из инициализатора для указания условия ошибки, как мы можем сделать в Objective-C.
  • Я чувствую, что передача NSErrorPointer инициализатору является громоздкой и создает ненужную нагрузку на потребителя класса.

Как бы вы проверили параметр для инициализатора в Swift?

Комментарии:

1. Вы не можете действительно перейти к NSErrorPointer , поскольку инициализатор в Swift не может вернуться nil

2. Лично я просто использую утверждения, если я попытаюсь инициализировать объект с недопустимым параметром, весьма вероятно, что мне нужно разобраться с этим на более ранней стадии стека.

Ответ №1:

Теперь с помощью Swift 2.0 вы можете создавать исключения. Например:

 enum Parameter: ErrorType {
    case Empty
    case Short
}
  

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

 guard parameter.characters.count > 0 else { throw Parameter.Empty }
  

И затем вы должны перехватить эти исключения:

 do {
    // call your method with try for example something like 'let var = try MyClass("test")'
} catch .Empty {

} catch .Short {

} catch {
    print("Something else went wrong!")
}
  

Комментарии:

1. Жаль, что нам пришлось ждать версии 2.0 для правильной обработки ошибок в Swft 😉

Ответ №2:

Вы можете сделать это с помощью функций класса. Смотрите ниже. Следует отметить два момента — функция класса должна возвращать Self ? не Self , чтобы разрешить возврат nil, и класс должен иметь @required init() .

 class Validate {
    class func instanceOrNil(valid: Bool) -> Self? {
        if valid {
            return self()
        } else {
            return nil
        }
    }
    @required init() {
    }
}

let iv = Validate.instanceOrNil(false) // nil
let v = Validate.instanceOrNil(true) // Validate instance
  

Фактический «практический» пример может выглядеть больше как

 class NumberLessThanTen {
    var mySmallNumber: Int?
    class func instanceOrNil(number: Int) -> NumberLessThanTen? {
        if number < 10 {
            return NumberLessThanTen(number: number)
        } else {
            return nil
        }
    }
    @required init() {
    }
    init(number: Int) {
        self.mySmallNumber = number
    }
}

let iv = NumberLessThanTen.instanceOrNil(17) // nil
let v = NumberLessThanTen.instanceOrNil(5) // valid instance
let n = v!.mySmallNumber // Some 5
  

Ответ №3:

Один из методов: создайте Thing.createThing( ... ) метод класса, который переносит инициализатор и возвращает необязательный Thing? . Выполните проверку внутри этого метода: если параметры проходят проверку, вызовите инициализатор с ними и верните результат. Если проверка завершилась неудачно, верните nil .