【发布时间】:2016-03-18 21:15:31
【问题描述】:
我正在使用 Swift 创建大量结构,所有这些都遵循基本相同的模式。每个结构都包含许多带有 getter 和 setter 的计算属性,每个结构类型之间的唯一区别是计算属性的数量以及每个属性的名称和类型。例如,
struct Employee
{
var title: String
{
get { /*...*/ return someDict["title"] as! String }
set { /*...*/ }
}
var id: Int
{
get { /*...*/ return someDict["id"] as! Int }
set { /*...*/ }
}
var salary: Double
{
get { /*...*/ return someDict["salary"] as! Double }
set { /*...*/ }
}
}
struct Student
{
var name: String
{
get { /*...*/ return someDict["name"] as! String }
set { /*...*/ }
}
var gpa: Double
{
get { /*...*/ return someDict["gpa"] as! Double }
set { /*...*/ }
}
}
现在,每个 getter 和 setter 在不同的结构中几乎相同,唯一的区别是每个都引用计算属性名称及其类型的硬编码字符串表示。
这有点麻烦和重复。很难只看一眼结构并了解它包含哪些属性,并且涉及大量重复代码。我考虑只是制作一个具有所需属性的协议并在结构中采用,这样至少协议会更具可读性,但它并不能解决重复代码的问题。我想做的是定义一个宏来定义这些属性,比如,
#define PROPERTY(NAME, TYPE) var NAME: TYPE { get{...} set{...} }
然后每个结构都可以更具可读性,并且重复代码会少很多,例如,
struct Employee
{
PROPERTY(title, String)
PROPERTY(id, Int)
PROPERTY(salary, Double)
}
struct Student
{
PROPERTY(name, String)
PROPERTY(gpa, Double)
}
有没有办法在 Swift 中做这样的事情?还是有更好的方法我应该考虑?我想要一个纯 Swift 解决方案,因为我在 Linux 上运行(基础不完整)。
【问题讨论】:
-
绝对没有预处理宏的解决方案。斯威夫特已经消除了这些恶作剧。可能值得编写一个代码生成器。
-
我认为您可能想出错误的解决方案来解决您的问题。如果您需要这么多结构,我建议可能有替代解决方案
-
我认为这不一定是真的@TobyAllen。组织良好的模型层没有任何问题。虽然,这可能确实有点 XY 问题。
-
好吧,我的基本问题是为什么要将所有这些属性存储在字典中而不是直接存储在对象中。即,为什么它们需要计算属性?
-
@DavidBerry 我知道 一些 的情况,这可能会使 一些 有意义。它不一定完全疯狂(尽管它可能是)。