Подтвердить что ты не робот

Объявление и использование пользовательских атрибутов в Swift

Я хотел бы иметь возможность комментировать мои типы и методы с помощью метаданных и читать их во время выполнения.

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

Для чтения потребуется какой-то механизм отражения, который мне вообще не удалось найти в ссылке, поэтому, вероятно, вторая часть вопроса - есть ли отражение. Если эти функции недоступны в Swift, они могут выполняться с кодом Objective-C (но в экземплярах и типах Swift)?

Относительно несвязанная заметка: решение того, что было смоделировано как атрибут, и то, что было добавлено к синтаксису ядра, кажется мне довольно произвольным. Кажется, что две разные команды работали над синтаксисом и некоторыми атрибутами. Например. они помещали weak и unowned в язык в качестве модификаторов, но сделали @final и @lazy. Я считаю, что как только они действительно добавят модификаторы доступа, они, вероятно, будут атрибутами, которые нравятся final. Все это как-то связано с взаимодействием Objective-C?

4b9b3361

Ответ 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"