Делает ли Guard копию переменных в Swift? - PullRequest
0 голосов
/ 14 июня 2019

В swift вы можете развернуть дополнительные значения с помощью защитного оператора

guard let foo = foo else { return nil }

Делает ли это заявление копию foo? Другими словами, может ли это утверждение быть потенциально дорогим, если foo очень велико?

Ответы [ 3 ]

1 голос
/ 14 июня 2019
 guard let foo = foo else { return nil }

Может ли это утверждение быть потенциально дорогим, если foo очень велико?

Вместо того, чтобы задавать себе вопрос таким образом, задайте его так: что, если бы вы сказали

if foo != nil {
    let foo = foo!
    // everything else here
}

Говорил foo!, чтобы развернуть Дополнительный "дорогой"? Каким бы ни был ваш ответ, он должен быть точно таким же для guard let foo = foo, потому что они оба делают точно одно и то же: они проверяют на nil и, если это безопасно, они разворачивают Optional. И это все они оба делают. Один - просто синтаксический сахар для другого.

0 голосов
/ 15 июня 2019

У вас есть два способа:

1 - только для проверки, не равен ли этот foo nil
В этом случае вы можете проверить, равен ли foo nil или нет

if foo != nil {
    // do you work here
}

2- Чтобы получить информацию из foo
В этом случае вы должны развернуть этот необязательный параметр (с помощью операторов guard-let или if-let), и здесь у нас есть два случая:
- если foo является классом, то этоссылочный тип.поэтому не будет копии и будет создана ссылка на этот экземпляр
- если foo является структурой, то это тип значения.поэтому создается совершенно новый экземпляр (скопированный из оригинала)
Также вы можете прочитать этот ответ , чтобы увидеть, если вы выберете struct или class в swift

0 голосов
/ 14 июня 2019

На самом деле это зависит от типа foo ex class, тип не создает копию в отличие от struct type

guard не волшебное ключевое слово, это просто if not, представленный в1 слово

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...