Как использовать охрану в swift вместо

Как использовать 'guard' в swift. Я просмотрел много статей о 'guard'. Но у меня не было четкого представления об этом. Пожалуйста, дайте мне ясную идею. Пожалуйста, дайте мне пример выходных данных для следующего утверждения "if".

if firstName != "" 
{
   if lastName != "" 
   {
      if address != "" 
      {
        // do great code
      }
   }
 }

4 ответа

Решение

Вы также можете использовать охрану, и ваш код будет более читабельным

let firstName = "First"
let lastName = "Last"
let address = "" // empty

if firstName != ""
{
    if lastName != ""
    {
        if address != ""
        {
            print(1,firstName,lastName, address)
        } else {
            print(1,"address is empty")
        }
    } else {
        print(1,"lastName is empty")
    }
} else {
    print(1,"firstName is empty")
}

func foo(firstName: String, lastName: String, address: String) {
    guard !firstName.isEmpty else { print(2,"firstName is empty"); return }
    guard !lastName.isEmpty else { print(2,"lastName is empty"); return }
    guard !address.isEmpty else { print(2,"address is empty"); return }

    print(2,firstName,lastName, address)
}

foo(firstName, lastName: lastName, address: address)
/*
 1 address is empty
 2 address is empty
 */
foo(firstName, lastName: lastName, address: "Address")
/*
 2 First Last Address
 */

Защитный оператор используется для переноса управления программой из области действия, если не выполнено одно или несколько условий.

func doSomething(data: String?) -> String {

    // If data is nil, then return
    guard let data = data else { return "Invalid data" }

    defer { print("This will always be printed if data isn't nil") }

    // data is now a non optional String
    if data.lowercaseString == "ok" { return "Data is \"ok\"" }

    return "I'm your father"
}

print(doSomething("ok"))

Выход:

This will always be returned if data isn't nil
Data is "ok"

Еще немного к вашему вопросу:

Значение любого условия в выражении guard должно иметь тип, соответствующий протоколу BooleanType.

func doSomething(data: String) -> String {

    guard !data.isEmpty else { return "Data is empty" }

    return data
}

print(doSomething("ok")) // ok
print(doSomething(""))   // Data is empty
  1. Цель защиты состоит в том, чтобы проверить некоторое условие и принудительно остановить выполнение, если это условие не выполняется, но defer определяет блок кода, который не выполняется до тех пор, пока выполнение не собирается покинуть текущую область.

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

  3. Охранники предоставляют альтернативу глубоко вложенным if-let, а defer предоставляют альтернативу try/finally правильно.

  4. Оба используются для потока управления и обработки ошибок

Использование защиты и отсрочки:

for imageName in imageNamesList {
    guard let image = UIImage(named: imageName)
else { continue }
    // do something with image
}

func deferExample() {
    defer {
        print(“This will be run last”)
    }
    defer {
         print(“This will be run second-last”)
    }
    print(“operation started”)
    // …
    print(“operation complete”)
}

Пожалуйста, посмотрите http://nstechstack.com/archives/question/223-1

Давайте пройдемся очень просто if подход.

class MySampleClass {

    var sampleString:String?

    func printSampleString() -> Void {


        if let str = sampleString{ ///if sampleString is nil the if will escape

            print(str) ///sampleString is not nil
        }
    }
}

var obj : MySampleClass = MySampleClass()
obj.sampleString = "SampleString"///Assign value to sampleString
obj.printSampleString()

Теперь давайте перейдем к guard подход

class MySampleClass {

    var sampleString:String?

    func printSampleString() -> Void {


        guard let str = sampleString else { ///guard will ensure sampleString is not nil

            return ///if sampleString is nil,then return
        }

        print(str) //sampleString is not nil,so print str!

    }
}

var obj : MySampleClass = MySampleClass()
obj.sampleString = "SampleString"///Assign value to sampleString
obj.printSampleString()
Другие вопросы по тегам