Вопросы от новичка


#1

Здравствуйте. У меня есть несколько вопросов, я только начал изучение свифт. Разъясните мне пожалуйста, кто может:

  1. Зачем нужны коллекции сеты? Почему они в случайном порядке распологаются?
  2. Зачем нужен guard? Я смотрю видеоурок, и он объясняет якобы тем, чтобы вложенностей if не было. Окей А что мешает if выполнить последовательно без вложенностей? Или я не так понял…

#2
  1. не совсем понял о чем речь
  2. guard упрощенная версия if else и в мире swift принято использовать guard для проверки существования, в противном случае делается выход. плюс после guard, если в нем условие приравнивалось к какой-то переменной, то эта переменная доступна после всей секции guard для работы.

#3
  1. Есть три типа коллекции: массивы, словари и множества (или сеты). Зачем нужны сеты? При каждой компиляции их порядок случайный. Для чего это нужно?
  2. В чем разница будет:

guard 2 == 3 else { return }
// здесь код не выполнится

if ( 2 != 3 ) { return; }
// здесь код не выполнится


#4
  1. в моей практике сэты использовались крайне редко, но бывало. если чесно не знаю чем они отличаются от обычных массивов, кроме как рандомным порядком. но у них так же есть свои методы
  2. guard чаще используется для проврки наличия данных в переменных или на наличие статусов, к примеру

guard let user = UserRepository().getUser() else {
    print("user not found")
    return
}

// тут уже можно работать с переменной user
userNameLabel.text = user.name

#5
  1. Как я понял дело именно в их методах. Но я тож подумал, что используются редко.
    С их помощью проще сравнивать значения или получаться повторяющиеся или наоборот значения… Но как я понял все привыкли писать свои решения для этого… надо вспомнить просто про сеты, это упростит и ускорит работу программы.

  2. Для проверки наличия данных можно использовать тот же IF… Все равно не понимаю)) Я выше привел пример кода… я могу сделать условие в if отрицательным и будет тот же эффект… Может на практике пойму для чего это нужно


#6

в if вам придется оборачивать большой кусок кода, а с guard вы избавитесь от вложенности кода в {}


#7

Или код после if все равно выполняется? Даже если я указываю return? Может дело в этом? Это единственное в моем понимании, что должно их отличать. Т е после return надо делать выход? И именно поэтому говорите о том, что проблема с ифом решается только оборачиванием?


#8

guard читается легче, как по мне.
единственное, в guard нельзя делать условие || (или). у него все условия идут как && (и)
guard condition1, condition2 else {}


#9
let a = true, b = false
guard a || b else { return }

#10

странно, я клянусь, я пробовал так делать и у меня не получалось.
что я тогда делал…


#11

У сета каждое значение уникально, не может быть дублей, это его фишка.

Больше, как минимум 4, ещё есть Range.


#12
  1. Аааа, точняк) Я запутался просто уже в этих многогранностях
  2. Я не задумывался о том, что range относится к коллекции, хотя логично))) Я как второй день изучаю свифт. Просто в видеоуроки не упомянули это как коллекцию

Если бы Вы еще ответили в чем все-таки отличие guard от if, было бы прекрасно)))


#13

Областью видимости

let a: Int? = nil
        
if let b = a {
            
}
print(b) // Error
        
guard let b = a else { return }
print(b)

Ещё guard не может case, а if может

let a: Int? = nil
if case let b? = a {
 
}

Тут нет разницы, можно и так и так.


#14

Я правильно понимаю, что отличие тупо в том, что в guard можно присваивать значение переменной, чтобы ее было видно? Т е то, что писал RexHunt… а я не услышал это… Я думал в IF тоже можно так делать… Ну точнее получается, что делать можно, но видно переменную не будет…


#15

в if можно, но переменная будет видна только внутри блока if


#16

аа, понял) спасибо за разъяснение!


#17

Если вы видите лестницу из вложенных if, возможно стоит использовать guard.


#18

про это я тоже писал, меньше вложенности

и вообще в swift принято использовать guard, привыкайте


#19
func nonguardSubmit() {
    if let name = nameField.text {
        if let address = addressField.text {
            if let phone = phoneField.text {
                sendToServer(name, address: address, phone: phone)
            } else {
                show("no phone to submit")
            }
        } else {
            show("no address to submit")
        }
    } else {
        show("no name to submit")
    }
}
func submit() {
    guard let name = nameField.text else {
        show("No name to submit")
        return
    }

    guard let address = addressField.text else {
        show("No address to submit")
        return
    }

    guard let phone = phoneField.text else {
        show("No phone to submit")
        return
    }

    sendToServer(name, address: address, phone: phone)
}

#20

Еще такая заметка. В else GUARD можно использовать только return…(для завершения типо) Соответственно гуард можно использовать только в блоке кода {} функции или какой-то итерации.