Объявление и использование пользовательских атрибутов в Swift
Я хотел бы иметь возможность комментировать мои типы и методы с помощью метаданных и читать их во время выполнения.
В языковой ссылке объясняется как объявить использование атрибутов, но действительно ли можно объявить свои собственные атрибуты?
Для чтения потребуется какой-то механизм отражения, который мне вообще не удалось найти в ссылке, поэтому, вероятно, вторая часть вопроса - есть ли отражение. Если эти функции недоступны в Swift, они могут выполняться с кодом Objective-C (но в экземплярах и типах Swift)?
Относительно несвязанная заметка: решение того, что было смоделировано как атрибут, и то, что было добавлено к синтаксису ядра, кажется мне довольно произвольным. Кажется, что две разные команды работали над синтаксисом и некоторыми атрибутами. Например. они помещали weak
и unowned
в язык в качестве модификаторов, но сделали @final
и @lazy
. Я считаю, что как только они действительно добавят модификаторы доступа, они, вероятно, будут атрибутами, которые нравятся final
. Все это как-то связано с взаимодействием Objective-C?
Ответы
Ответ 1
Если мы возьмем iBook как окончательный, похоже, не существует способа создания произвольных новых атрибутов так, как вы можете в Java и .NET. Я надеюсь, что эта функция появится позже, но на данный момент похоже, что нам не повезло. Если вам нужна эта функция, вы должны отправить запрос расширения с Apple (компонент: Swift Версия: X)
FWIW, там действительно нет способа сделать это в Objective-C.
Ответ 2
Теперь вы можете сделать что-то вроде этого! Проверьте "Property Wrappers" - https://docs.swift.org/swift-book/LanguageGuide/Properties.html
Вот пример с этой страницы:
@propertyWrapper
struct TwelveOrLess {
private var number = 0
var wrappedValue: Int {
get { return number }
set { number = min(newValue, 12) }
}
}
struct SmallRectangle {
@TwelveOrLess var height: Int
@TwelveOrLess var width: Int
}
var rectangle = SmallRectangle()
print(rectangle.height)
// Prints "0"
rectangle.height = 10
print(rectangle.height)
// Prints "10"
rectangle.height = 24
print(rectangle.height)
// Prints "12"