Как создать элегантный оператор защиты / возврата в Swift, который дает вывод? - PullRequest
0 голосов
/ 13 ноября 2018

Например, это работает:

guard condition == true else { return }

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

guard condition == true else { stop("condition was false") }

Я живу здесь, в стране грез, или это возможно?

Конечно, я признаю, что возможно следующее:

guard condition == true else { 
    print("condition was false")
    return
}

Но это тяжело и некрасиво. У меня есть защитные заявления везде , этот вид кода: 1. полезен; но 2. увеличит объем моего кода примерно на 10%.

Я знаю, что это утопия, но я бы предпочел элегантное решение. Кто-нибудь? * * 1016

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Используйте precondition вместо guard:

func test() {
    precondition(yourCondition, "This is an error message")
    //rest of your function
}

Если yourCondition имеет значение false, область действия будет закрыта и будет напечатано сообщение об ошибке.

0 голосов
/ 13 ноября 2018

Попробуйте использовать closures, чтобы это заработало, т.е.

func func1(handler: ((String)->())) {
    let condition = (2 == 2)
    guard condition == true else {
        handler("condition was false")
        return
    }
}

func1 { (reason) in
    print(reason)
}
0 голосов
/ 13 ноября 2018

Как я понимаю, вы хотите произвести вывод или показать сообщение в ложном состоянии или в нулевом значении, прежде чем вернуться в охрану. Ниже мое мышление:

func checkForNil(value: Any?) -> Any?
    {
        if value == nil
        {
            //showMessage("Nil value...")
            print("nil value")
        }
        return value
    }

Вы можете использовать это, как показано ниже:

guard let obj = self.checkForNil(value: objLoggedInUser) else { return}
0 голосов
/ 13 ноября 2018

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

func myReturn() -> String? {
    guard condition else { return nil }
}

если вам нужен аналог стопа, вы можете бросить Error или даже fatalError

func myReturn() throws -> String {
    guard condition else {
         throw BadConditionError
     }
}

Или

func myReturn() -> String {
    guard condition else {
         fatalError("Bad condition")
     }
}

guard - это механизм раннего выхода, он не позволяет вашей программе перейти в недопустимое состояние, используйте его соответствующим образом. Я также рекомендовал бы читать на defer механизме.

...