Почему функция имеет долгосрочный доступ на запись ко всем входным и выходным параметрам?
Согласно главе "Безопасность памяти" в Руководстве по языку программирования Swift (для Swift 4.2), есть предложение "Функция имеет долгосрочный доступ для записи ко всем своим входящим и исходящим параметрам". https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html
Я создал новый проект инструмента командной строки, чтобы проверить это в Xcode 10.1.
var stepSize = 1
func increment(_ number: inout Int) {
print(stepSize)
}
increment(&stepSize)
Я ожидаю, что выходные данные будут равны 1, но фактическим выводом является журнал сбоев "Одновременный доступ к 0x100587430, но для модификации требуется исключительный доступ".
Я знаю, что это конфликт из-за доступа к параметрам ввода-вывода, но я не знаю, почему это происходит. Почему функция имеет долгосрочный доступ на запись ко всем входным и выходным параметрам?
1 ответ
Потребитель этого API видит func increment(_ number: inout Int)
, но не реализация. Можно только предположить, что increment(_:)
делает записи в параметры, потому что может, в принципе.
Даже если реализация функции в настоящее время не выполняет никаких операций записи, такая возможность существует, поэтому компилятор должен принять наихудший сценарий. Представьте себе, если какой-то клиентский код был разрешен для компиляции, то это выглядит так, как будто он только для чтения (потому что в то время это может иметь место). Что должно случиться с клиентским кодом, когда кто-то добавляет number += 1
к функции тела?
Это похоже на наличие функции, которая объявляет, что может throw
чья фактическая реализация не throw
, Компилятор все еще рассматривает это как бросание, и требует, чтобы ошибка была обработана с некоторым вариантом try
,