Предоставление пользовательского резервного хранилища для свойств экземпляра класса Swift, подкласса из NSObject - PullRequest
0 голосов
/ 06 января 2020

У меня есть требование, аналогичное описанному в в этом вопросе .

Я хочу динамически генерировать методы получения и установки для класса Swift, наследуемого от NSObject во время выполнения (аналогично тому, что NSManagedObject делает за кулисами).

Ответы на этот вопрос, упоминает использование @ dynamici c для подавления Objective- C предупреждений компилятора и последующего выполнения методов.

Кроме того, при использовании CoreData в Swift мы имеем @NSManaged атрибут, который сообщает компилятору Swift , что это хранилище свойств не является обычным хранилищем, но имеет некоторое собственное хранилище резервных копий, предоставляемое CoreData.

Есть ли способ аналогичным образом сообщить компилятору Swift , что мои свойства для пользовательского класса имеют собственное резервное хранилище и не используют обычное хранилище, предоставленное Swift?

Я имею в виду оболочки свойств для изменения хранилища, но правильное ли это направление к go в сторону или есть какой-то другой путь?

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

@MyCustomPropWrapper(backingStore: someStore) var counter: Int

1 Ответ

0 голосов
/ 06 января 2020

Вы можете сделать что-то похожее на то, что вы описали, используя две функции времени выполнения Objective- C:

Связанные объекты:

Вы можете динамически устанавливать свойство в объект Objective- C, использующий связанные объекты. Документация для этой функции здесь , вот руководство по стилю .

Переадресация вызова:

Objective- C использует метод отправки сообщений в стиле сообщений. Это означает, что методы разрешаются во время выполнения. И наоборот, по умолчанию Swift использует диспетчеризацию stati c и vtable, поэтому все компоновки выполняются во время компиляции. Однако вы можете указать Swift использовать обмен сообщениями, начиная с NSObject.

Динамическая c диспетчеризация дает возможность обеспечить реализацию метода, который не определяется статически во время компиляции. Механизм для этого заключается в использовании forwardInvocation, который описан здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...