2016-05-07 2 views
4

Как я могу выполнить более одного охранного оператора в цикле без выхода из цикла? Если один защитный оператор выходит из строя, он выталкивает меня из текущей итерации цикла и обходит оставшийся код.Как выполнить несколько операторов-хранителей в цикле?

for user in users { 
    guard let first = user["firstName"] as? String else { 
     print("first name has not been set") 
     continue 
    } 
    print(first) 

    guard let last = user["lastName"] as? String else { 
     print("last name has not been set") 
     continue 
    } 
    print(last) 

    guard let numbers = user["phoneNumbers"] as? NSArray else { 
     print("no phone numbers were found") 
     continue 
    } 
    print(numbers) 
} 

Как обеспечить выполнение всех операторов для каждого пользователя? Помещение возврата и разрыва внутри блоков else тоже не работает. Благодаря!

ответ

4

Цель защитного утверждения проверить состояние (или пытаться разворачивать опциональный), и если это условие ложно или параметр равен нулю, то вы хотите, чтобы выйти из текущей области вы находитесь.

Представьте, что в заявлении охранника говорится (в голосе Гэндальфа): «Вы не пройдете ... если вы не выполните это условие».

То, что вы хотите сделать здесь можно просто сделать с if let заявления:

for user in users { 
    if let first = user["firstName"] as? String { 
    print(first) 
    } else { 
    print("first name has not been set") 
    } 
    //Do the same for the other fields 
} 

Одна вещи, чтобы отметить, что guard let в защитном заявлении позволит вам получить доступ к развернутому значению после guard заявления, в котором поскольку if let позволит вам получить доступ к этому значению в следующем блоке.

+0

awesome! Я знал, что «если пусть» будут работать заявления, но я пытался чаще использовать охрану, поэтому я не знал, есть ли способ, которым я мог бы выполнить ту же задачу с защитой. Теперь я знаю лучше. Спасибо за разъяснения! – user3353890

+0

@ user3353890: Вы можете выполнить его с помощью 'guard', если вы используете' completehandler' ... –

+1

@ user3353890 рад, что я могу помочь, охранники - очень мощный инструмент, обратите внимание, что я добавил небольшое различие в свой ответ –