После прочтения раздела «Безопасность памяти» в документации Swift у меня возник вопрос, на который я не могу ответить.
Итак, у меня есть следующий код, основанный на фрагментах из документации Swift:
func balance(_ x: inout Int, _ y: inout Int) {
let sum = x + y
x = sum / 2
y = sum - x
}
struct Player {
var name: String
var health: Int
var energy: Int
}
// 1 - Memory Safety test for two different integers (just to see how this works)
var playerOneScore = 42
var playerTwoScore = 30
balance(&playerOneScore, &playerTwoScore)
print("Player 1 Balanced Score is: \(playerOneScore)")
print("Player 2 Balanced Score is: \(playerTwoScore)")
// 2 - Memory Safety test for the same two integers. COMPILE-TIME ERROR HERE.
balance(&playerOneScore, &playerOneScore)
print("Player 1 Balanced Score is: \(playerOneScore)")
print("Player 2 Balanced Score is: \(playerTwoScore)")
// 3 - Memory Safety test for the same property of a struct instance. THIS WORKS FINE.
var holly = Player(name: "Holly", health: 14, energy: 10)
balance(&holly.health, &holly.health)
print("Holly's Balanced Health is \(holly.health)")
// 4 - Memory Safety test for the same property of a tuple. THIS ALSO WORKS FINE.
var playerInformation = (health: 10, energy: 20)
balance(&playerInformation.health, &playerInformation.health)
print("Health is: \(playerInformation.health)")
print("Energy is: \(playerInformation.energy)")
Итак, из документации я понимаю ошибку из раздела 2 в этом коде, потому что я бы дважды писал одно и то же место в памяти.Проблема возникает для разделов 3 и 4. Похоже, что я должен получить ту же ошибку, что и в разделе 2, потому что в обоих случаях я также получал бы доступ к тому же адресу в памяти.Что мне здесь не хватает?
Кроме того, в документации сказано, что код, аналогичный приведенному в разделе 4 моего кода, должен выдавать ошибку.Исходный код из документации выглядит следующим образом:
var playerInformation = (health: 10, energy: 20)
balance(&playerInformation.health, &playerInformation.energy)
// Error: conflicting access to properties of playerInformation
Наконец, в разделе 3 моего кода должна появиться ошибка, и, по мнению Apple, способ ее устранения состоит в том, чтобы сделать ее локальной переменной.Исходный код из документации выглядит следующим образом:
var holly = Player(name: "Holly", health: 10, energy: 10)
balance(&holly.health, &holly.energy) // Error
func someFunction() {
var oscar = Player(name: "Oscar", health: 10, energy: 10)
balance(&oscar.health, &oscar.energy) // OK
}
Итак, подводя итог, можно задать следующие вопросы:
A), почему раздел 2 в моем коде работает, а раздел 3 и 4 - нет?
B) почему ошибки во фрагментах из документации Apple на самом деле не создают ошибок в компиляторах и действительно работают?
Спасибо!