【问题标题】:Use function to define struct properties in Swift在 Swift 中使用函数定义结构属性
【发布时间】: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 我知道 一些 的情况,这可能会使 一些 有意义。它不一定完全疯狂(尽管它可能是)。

标签: linux swift


【解决方案1】:

我能想到的最佳方法是创建一个外部脚本,该脚本将某种简化模板作为输入并输出一个 .swift 文件,作为预编译构建阶段运行。比如:

Input.notswift:

extension Employee {
    PROPERTY(title, String, "title")
}

然后作为预编译构建阶段运行(类似于,转义都是错误的):

sed s/PROPERTY\(([^,]*), ([^,]*), ([^,]*)\)/var NAME: TYPE { get{...} set{...} }/ < Input.notswift > Properties.swift

或者,您可以在 Input.notswift 上手动运行 C 预处理器以生成 Input.swift。一旦您决定采用预处理方法,您可以使用无穷无尽的机制从 .notswift 生成 .swift。

【讨论】:

  • 谢谢,我担心这样的方法可能是最干净的方法
猜你喜欢
  • 2021-06-19
  • 2012-04-09
  • 1970-01-01
  • 2021-12-17
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多