#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
.