У меня есть простой Person
класса в Swift, который выглядит примерно так:Дополнительный массив против пустого массива в Swift
class Person {
var name = "John Doe"
var age = 18
var children = [Person]?
\\ init function goes here, but does not initialize children array
}
Вместо того, чтобы объявить children
быть дополнительным массив, я мог бы просто объявить и инициализировать его как пустой массив:
var children = [Person]()
Я пытаюсь решить, какой подход лучше. Объявление массива как необязательного массива означает, что он не будет занимать какую-либо память вообще, тогда как пустой массив имеет по крайней мере некоторую память, выделенную для него, правильно? Таким образом, использование необязательного массива означает, что будет по крайней мере некоторое сохранение памяти. Я предполагаю, что мой первый вопрос: действительно ли существует реальная экономия памяти, или мои предположения об этом неправильны?
С другой стороны, если он не является обязательным, то каждый раз, когда я пытаюсь его использовать, мне нужно будет проверить, есть ли оно nil
или нет, перед добавлением или удалением из него объектов. Так что там будет некоторая потеря эффективности (но не так много, я думаю).
Я как бы факультативный подход. Не каждый Person
будет иметь детей, так почему бы не позволить children
быть nil
до Person
решает поселиться и поднять семью?
Во всяком случае, я хотел бы знать, есть ли какие-либо другие конкретные преимущества или недостатки для одного подхода или другого. Это вопрос дизайна, который будет возникать снова и снова.
У вас есть правильный вопрос, но я думаю, что аргументы за и против опасны - на основе преждевременной оптимизации, а не семантики. Гораздо лучше сосредоточиться на «доступности» кода - насколько он предлагает намерение (что бы это ни было для контекста). В Swift есть множество вещей, которые мне не нравятся, но для меня тип Optional - настоящий камень. Хотя для вашего вопроса нет «правильного» ответа, я широко использую его в таких контекстах, как ваш. Использование опционального для случая дополнительных детей кажется вполне разумным и минималистичным. –
Я бы предположил, что количество элементов в массиве, равное нулю, означает, что есть нулевые дети. Массив nil предположил бы, что существует число детей, которые не могут быть равны нулю и не могут быть ненулевыми. Нет никакой логики в возвращении nil, поскольку в ней нет смысла. Чтобы сохранить код, написанный 20 лет назад, я могу сказать вам, что если вы предложите какое-то другое значение, вернув nil, кто-то его смутит, и задайтесь вопросом, что вы намеревались сделать с этим nil, что пустой массив не выполнить. производительность пустого массива вряд ли будет иметь значение. –