параметр метода может передать объект ссылкой, но быть только для чтения?

Как отметил @nhgrif в своем превосходном ответе, существует множество способов, которыми VC (контроллеры просмотра) и другие объекты могут связываться друг с другом.

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

Ответ nhrif позволяет отправлять информацию непосредственно из источника в пункт назначения VC. Как я уже упоминал в ответ, также можно отправлять сообщения от адресата к источнику.

Фактически вы можете настроить активный односторонний или двухсторонний канал между различными контроллерами. Если контроллеры представлений связаны через segue раскадровки, время, необходимое для настройки ссылок, находится в методе prepareFor Segue.

У меня есть пример проекта в Github, который использует родительский контроллер представления для размещения 2 разных таблиц как дети. Контроллеры дочерних представлений связаны с использованием встроенных сегментов, а контроллер родительского представления подключает двухсторонние ссылки с каждым контроллером представления в методе prepareForSegue.

Вы можете найти этот проект на github (ссылка). Однако я написал его в Objective-C и не преобразовал его в Swift, поэтому, если вам не удобно в Objective-C, может быть немного трудно следовать

17
задан Incognito 8 August 2010 в 08:59
поделиться

5 ответов

Нет. C # не имеет прямого аналога C ++ const (его собственный const - это нечто иное). Обычный шаблон C # для этого состоит в передаче интерфейса, такого как IEnumerable, который не допускает модификаций. Вы также можете создать неизменную копию или оболочку.

17
ответ дан 30 November 2019 в 13:04
поделиться

Это невозможно в C #.

Вы можете предотвратить это, передав неизменный объект.

3
ответ дан 30 November 2019 в 13:04
поделиться

Если класс передаваемого объекта был написан вами, то вам повезло.

Спросите себя: если бы в C# была функция const, какие операции над объектом я ожидал бы запретить через const ссылку на мой класс?

Затем определите интерфейс, который не содержит запрещенных операций.

Например:

class MyClass 
{
    public string GetSomething() { ... }

    public void Clobber() { ... }

    public int Thing { get { ... } set { ... } }
}

Соответствующий "const" интерфейс может быть таким:

interface IConstMyClass 
{
    public string GetSomething() { ... }

    public int Thing { get { ... } }
}

Теперь измените класс:

class MyClass : IConstMyClass
{

Теперь вы можете использовать IConstMyClass для обозначения const MyClass.

 void MyMethod(int x, int y, IConstMyClass obj)

Примечание: найдутся те, кто скажет, что этого недостаточно. Что если MyMethod возвращается к MyClass? Но не обращайте на них внимания. В конечном итоге исполнитель может использовать отражение, чтобы обойти любой аспект системы типов - см. этот забавный пример.

Единственный вариант остановить атаки отражения - это тривиальный подход: сделать полностью отсоединенный клон.

6
ответ дан 30 November 2019 в 13:04
поделиться

Не существует механизма, который сделал бы это за вас.

Либо передать одноразовую копию, либо встроить неизменяемость, даже временную, в сам класс.

0
ответ дан 30 November 2019 в 13:04
поделиться

почему бы вам не сделать копию этого объекта и не делать с этой копией все, что вы хотите, пока ваш obj остается неизменным.

См. Здесь, как клонировать свой объект: Объекты глубокого клонирования

0
ответ дан 30 November 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: