Swift中的反思还是仅仅是自省?
作为软件开发人员,我们对称为反射的概念非常了解,但是我们是否可以在iOS中轻松使用它,尤其是在Swift中?
反射被定义为计算机程序在运行时检查,自省和修改其自身的结构和行为的能力。
由于Swift是一种静态类型的语言,我们几乎不使用反射,但是自从Swift 2使用镜像结构以来,就可以使用反射的支持,但是它更像是iOS提供的自省功能,因为它仅允许我们查看对象的属性而不修改它们但我们无法访问计算的属性和方法,它也适用于类和结构的对象类型。 在Metatype
,每种Swift元数据类型都有Mirror
实现: Tuple
, Struct
, Enum
, Class
, Metatype
都从ReflectionMirrorImpl
抽象类派生。
让我们采用一个名为Person的结构,它具有以下属性
并将Person的实例创建为–
那么使用struct Mirror并使用镜像中称为 child的属性,可以很容易地检查属性及其值。
每当我们遵守上述任何协议时,无论何时在结构或类中添加或删除属性时,都必须更改已实现的方法,这非常令人沮丧且容易出错,因为我们可能忘记了在一致性方法中对其进行更新。 因此,镜子来了我们的营救。
有一系列转储函数,它们通过使用给定项的镜像来组成给定项的文本表示形式。 该方法假设相等的对象始终具有相同的镜像。 在将其合并到生产代码中之前,请根据您的域模型评估此假设。
现在,我可以简单地在Person结构的两个实例上使用equatable运算符,而不必担心其中的修改。
注意
Mirror当前在Swift中处理类和结构的对象,为了在类型上进行处理,我们必须借助目标C运行时的帮助,这将是前几天的话题,但是本文将为您提供有关反射如何在Swift中工作。
Apple本身使用反射在调试器和游乐场中显示值,反射的两种可能的应用是:
- 测井
- 生成用于单元测试的模拟
调试需要日志记录,并且模拟可以生成一次,然后在必要时进行更新。
码
不断分享,不断学习
- 屏幕locking时HealthStore enableBackgroundDelivery
- Objective-C – 与C ++桥接的缺点?
- 更改UITextView字体w / o删除粗体/下划线/斜体格式
- 如何使用fmdblogin页面?
- 在滚动视图中隐藏视图后删除空白空间?
- 如何处理同步错误:“收到错误的变更集:断言失败:left()。link_target_table_ndx == right()。link_target_table_ndx”
- Android应用程序到IOs的移植?
- iPad相机popover预览错误的旋转和缩放
- 何时使用__bridge,__bridge_transfer / CFBridgingRelease和__bridge_retained / CFBridgingRetain