gpt4 book ai didi

linux - 在 Swift 中使用函数定义结构体属性

转载 作者:搜寻专家 更新时间:2023-10-31 23:00:38 24 4
gpt4 key购买 nike

我正在使用 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 在不同的结构中几乎相同,唯一的区别是每个都引用计算属性名称及其类型的硬编码字符串表示。

这有点麻烦和重复。很难只看一眼结构就知道它包含什么属性,并且涉及很多重复的代码。我考虑只制作一个具有所需属性的协议(protocol)并在结构中采用,这样至少协议(protocol)会更具可读性,但它并没有解决重复代码的问题。我想做的是定义一些类似定义这些属性的宏,比如,

 #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 中做这样的事情?或者我应该考虑更好的方法吗?我在 Linux 上运行时想要一个纯 Swift 解决方案(不完整的基础)。

最佳答案

我能想到的最佳方法是创建一个外部脚本,该脚本将某种简化模板作为输入并吐出一个 .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。

关于linux - 在 Swift 中使用函数定义结构体属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36094363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com