Если я принудительно разверну экземпляр структуры, Swift скопирует его? - PullRequest
2 голосов
/ 26 марта 2020

Если я принудительно разверну необязательный экземпляр структуры, сделает ли Swift его копию?

Например, в следующем коде, где Point является структурой, копирует ли Swift (внутренне) point когда я разверну его?

var point: Point?
point = Point(x: 0, y: 0)
print(point!.x)

Дополнительный вопрос

Если нет, то

if point != nil {
  print(point!.x)
}

будет более эффективным, чем

if let point = point {
  print(point.x)
}

, поскольку я предполагаю, что последний код (из-за назначения) заставляет Swift сделать копию point, правильно ??

1 Ответ

1 голос
/ 26 марта 2020

Хороший вопрос.

Если я принудительно разверну необязательный экземпляр структуры, сделает ли Swift его копию?

Пока нет.

print(point!.x)

На самом деле означает:

switch point {
    case .some(let _point): print(_point.x) 
    case .none: fatalError()
} 

Но архитектура Swift является копией при записи . Пока что никаких изменений нет, следовательно, копирование не происходит

Однако, если вы сделаете что-то вроде:

if var point = point { // notice the usage of `var` instead of `let`
    point.x = 5 // copy on write happened at this line. Because you just changed a property of `point` — assuming that `x` is a value type
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...