在Swift中声明和使用自定义属性

Seb*_*ian 22 swift

我希望能够使用元数据来注释我的类型和方法,并在运行时读取它们.

语言参考解释了如何声明属性用法,但实际上是否可以声明自己的属性?

阅读需要某种反射机制,我根本无法在参考文献中找到,因此问题的第二部分可能是 - 是否有可能反思.如果Swift中没有这些功能,可以使用Objective-C代码(但在Swift实例和类型上)吗?

一个相对不相关的注释:已经建模为属性的决定以及添加到核心语法中的内容让我觉得非常武断.感觉两个不同的团队在语法和某些属性上工作.例如,他们把weakunowned到语言作为修饰,但做@final@lazy属性.我相信,一旦他们实际添加了访问修饰符,他们可能会喜欢属性final.所有这些都与Objective-C互操作性有关吗?

Max*_*mia 8

你现在可以做这样的事情!查看“属性包装器” - 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"
Run Code Online (Sandbox Code Playgroud)

  • 好的 - 现在有一个属性的特殊情况 - 据我所知,正是为了装饰属性的目的。但您仍然无法在运行时通过反射读取该元数据。所以这很简洁,但遗憾的是对于这个问题根本没有帮助。虽然[他们似乎同意我的观点](https://forums.swift.org/t/custom-attributes/13976),认为这个功能很好,但我想它仍然不可用。 (5认同)

ipm*_*mcc 6

如果我们将iBook作为权威,那么似乎没有面向开发人员的方式以Java和.NET的方式创建任意新属性.我希望这个功能能在以后出现,但是现在看来我们运气不好.如果您关心此功能,则应向Apple提交增强请求(组件:Swift版本:X)

FWIW,在Objective-C中也没有办法做到这一点.