Объявление и использование пользовательских атрибутов в Swift
Я хотел бы иметь возможность комментировать мои типы и методы с метаданными и читать их во время выполнения.
Справочник по языку объясняет, как объявлять использование атрибутов, но возможно ли на самом деле объявить ваши собственные атрибуты?
Чтение потребовало бы какого-то механизма отражения, который я вообще не смог найти в справочнике, поэтому вторая часть вопроса, вероятно, такова: возможно ли отражение? Если эти функции недоступны в Swift, могут ли они быть реализованы с помощью кода Objective-C (но для экземпляров и типов Swift)?
Относительно не связанное примечание: решение о том, что было смоделировано как атрибут и что было добавлено в основной синтаксис, кажется мне довольно произвольным. Такое ощущение, что две разные команды работали над синтаксисом и над некоторыми атрибутами. Например, они положили weak
а такжеunowned
в язык как модификаторы, но сделал @final
а также@lazy
атрибутов. Я считаю, что как только они действительно добавят модификаторы доступа, они, вероятно, станут атрибутами final
, Связано ли все это с совместимостью Objective-C?
1 ответ
Если мы возьмем iBook как окончательный вариант, то, похоже, не существует способа создания произвольных новых атрибутов, как вы можете это делать в Java и.NET. Я надеюсь, что эта функция появится позже, но сейчас, похоже, нам не повезло. Если вы заботитесь об этой функции, вам следует подать запрос на улучшение в Apple (Компонент: Swift Version: X)
FWIW, на самом деле нет способа сделать это и в Objective-C.
Теперь вы можете сделать что-то подобное! Ознакомьтесь с "Упаковщиками свойств" - 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"