Насколько безопасны быстрые коллекции при использовании с недействительными итераторами / индексами?
Я не вижу много информации в быстрой ссылке на stdlib. Например, словарь говорит, что определенные методы (например, удаление) лишают законной силы индексы, но это все.
Чтобы язык мог называть себя «безопасным», ему необходимо решение классических C ++ лакунов:
получить указатель на элемент в векторе, затем добавить больше элементов (указатель теперь недействителен), теперь использовать указатель, сбой
начать перебирать коллекцию. во время итерации удалите некоторые элементы (до или после текущей позиции итератора). продолжить итерацию, сбой.
(редактировать: в C ++, высчастливый сбой - в худшем случае это повреждение памяти)
Я считаю, что 1 решается с помощью swift, потому что, если коллекция хранит классы, взятие ссылки (например, сильного указателя) на элемент увеличит количество ссылок. Тем не менее, я не знаю ответ на 2.
Было бы очень полезно, если бы в С ++ было сравнение гангстеров, которые не решаются с помощью swift.
РЕДАКТИРОВАТЬ, из-за ответа Робс:
Похоже, что в словаре и / или для циклов происходит какое-то недокументированное поведение, похожее на снимок. Итерация создает моментальный снимок / скрытую копию при запуске.
Что дает мне и большую «WAT» и «круто, это вроде безопасно, я думаю», и «насколько дорогая эта копия?».
Я не вижу этого ни в Генераторе, ни в цикле for.
Приведенный ниже код печатает два логических снимка словаря. Первый снимокuserInfo
как это было в начале цикла итерации, и не отражает какие-либо изменения, сделанные во время цикла.
var userInfo: [String: String] = [
"first_name" : "Andrei",
"last_name" : "Puni",
"job_title" : "Mad scientist"
]
userInfo["added_one"] = "1" // can modify because it's var
print("first snapshot:")
var hijacked = false
for (key, value) in userInfo {
if !hijacked {
userInfo["added_two"] = "2" // doesn't error
userInfo.removeValueForKey("first_name") // doesn't error
hijacked = true
}
print("- \(key): \(value)")
}
userInfo["added_three"] = "3" // modify again
print("final snapshot:")
for (key, value) in userInfo {
print("- \(key): \(value)")
}