在Swift中声明和使用自定义属性
我希望能够用元数据注释我的类型和方法,并在运行时读取它们 语言参考解释了这一点,但实际上是否可以声明自己的属性 阅读需要某种反思机制,而我在参考文献中根本找不到这种机制,所以问题的第二部分可能是——是否有可能进行反思。如果这些功能在Swift中不可用,是否可以使用Objective-C代码(但在Swift实例和类型上)实现在Swift中声明和使用自定义属性,swift,Swift,我希望能够用元数据注释我的类型和方法,并在运行时读取它们 语言参考解释了这一点,但实际上是否可以声明自己的属性 阅读需要某种反思机制,而我在参考文献中根本找不到这种机制,所以问题的第二部分可能是——是否有可能进行反思。如果这些功能在Swift中不可用,是否可以使用Objective-C代码(但在Swift实例和类型上)实现 一个相对不相关的注意事项:什么被建模为属性以及什么被添加到核心语法的决定让我觉得相当武断。感觉就像是两个不同的团队在语法和一些属性上进行了工作。例如,他们在语言中作为修饰语输
一个相对不相关的注意事项:什么被建模为属性以及什么被添加到核心语法的决定让我觉得相当武断。感觉就像是两个不同的团队在语法和一些属性上进行了工作。例如,他们在语言中作为修饰语输入,但生成属性。我相信一旦他们真的添加了访问修饰符,他们很可能是像
final
这样的属性。所有这些是否都与Objective-C互操作性有关?如果我们将iBook视为权威,那么似乎没有面向开发人员的方法可以像Java和.NET中那样创建任意的新属性。我希望这个功能稍后会出现,但现在看来我们运气不好。如果您关心此功能,则应提交(组件:Swift版本:X)
FWIW,在Objective-C中也没有这样做的方法。您现在可以这样做了!查看“属性包装器”—— 下面是该页面中的一个示例:
@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"
由于您运行的是与ObjC代码相同的运行时,反射在某种程度上应该是可能的。@Leandros:我根本不是ObjC专家-您能告诉我们怎么做吗?我知道它存在两种不同的“类型”,例如,弱是llvm本机支持的ARC功能,其他元素,例如,@objc是一个更高级别的东西,我希望他们使用llvm元数据来实现这一点。但总体上,您是否找到了在运行时读取现有属性的方法?(我还没有找到它)@Stephan:没有,我没有找到解决方案,也没有真正找到时间去做。Swift 2.0也是这样吗?我严重依赖代码中的属性(Java中的注释),尤其是在序列化/反序列化和ORM方面。我认为,应该将自定义属性添加到SwiftORM中,这可以说是我所能想到的最不引人注目的属性,这是一种持久性方法,目前在遗留情况之外基本上被忽略了。我并不是说Swift不应该有属性,但ORM不太可能成为一种“绿色领域”语言添加功能的有力案例。好吧,现在有一个属性的特例——据我所知,正是为了装饰属性。但您仍然无法通过反射在运行时读取元数据。所以这很好,但遗憾的是对这个问题毫无帮助。虽然拥有这个功能会很好,但我想它仍然不可用。