Инкапсуляция данных в Swift

Я прочитал все Swift книга, и смотрел все WWDC видео (которые я люблю). Меня беспокоит инкапсуляция данных.

рассмотрим следующий (полностью надуманный) пример:

class Stack<T>
{
    var items : T[] = []

    func push( newItem: T ) {
        items.insert( newItem, atIndex: 0 )
    }

    func pop() -> T? {
        if items.count == 0 {
            return nil;
        }

        return items.removeAtIndex( 0 );
    }
}

этот класс реализует стек, и реализует его с помощью массива. Проблема в том, items (как и все свойства в Swift) является общедоступным, поэтому ничто не мешает кому-либо напрямую обращаться (или даже мутировать) он отделен от публичного API. Как ворчливый старый парень на C++, это делает меня очень сварливым.

Я вижу, как люди оплакивают отсутствие модификаторов доступа, и хотя я согласен, что они будут непосредственно решать эту проблему (и я слышу слухи, что они могут быть реализованы в ближайшее время (TM)), мне интересно, какие стратегии для сокрытия данных будут в их отсутствие.

Я что-то пропустил, или это просто упущение в языке?

3 ответов


Он просто отсутствует в данный момент. Грег Паркер прямо заявил (в этой теме форумов dev), что модификаторы видимости идут.

учитывая, что нет заголовков, стандартные трюки Objective-C не будут работать, и я не могу придумать другой трюк для ограничения видимости, который не включает в себя много изгибов назад. Поскольку функция языка была обещана, я не уверен, что она стоит больших инвестиций.

на светлой стороне, так как это функция is в flux, сейчас отличное время для радар и влиять на то, как это получается.


обновленный ответ для дальнейшего использования.

от Apple документация:

Уровни Доступа

Swift обеспечивает три различных уровня доступа для сущности в вашем коде. Эти уровни доступа относятся к исходный файл, в котором определена сущность, а также относительно модуль, которому принадлежит исходный файл.

открытый доступ позволяет объектам использовать в любом исходном файле из их определяющего модуля, а также в исходный файл из другого модуля, импортирующего определяющий модуль. Обычно при указании открытого интерфейса используется открытый доступ к рамкам.

внутренний доступ позволяет использовать сущности в любых исходный файл из их определяющего модуля, но не в любом исходном файле за пределами этого модуля. Вы обычно используете внутренний доступ, когда определение внутреннего приложения или фреймворка структура.

Частный доступ ограничивает использование сущности собственным определяющим исходным файлом. Использовать Частный доступ, чтобы скрыть детали реализации конкретной части функциональности. Публичный доступ является самым высоким (наименее ограничительным) уровень доступа и частный доступ является самым низким (или наиболее ограничительным) уровень доступа.


на самом деле я был в восторге от того, что Swift наконец-то принял статическую типизацию, так соответствующую теории для кода с оптимальными свойствами OO, все же падение заголовков нарушает само менинг объектно-ориентированного программирования, а именно инкапсуляцию. Выход был бы похож на то, что Eiffel автоматически извлекает заголовки, но без указания того, какие из них являются публичными интерфейсами, а какие частными, это было бы бесполезно. Я действительно огорчен этим шагом Apple.