Безопасность памяти для одного и того же адреса: конфликт между Int и Tuplet и Struct - PullRequest
0 голосов
/ 27 ноября 2018

После прочтения раздела «Безопасность памяти» в документации 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 на самом деле не создают ошибок в компиляторах и действительно работают?

Спасибо!

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