我正在尝试编写某种数据类型的“限制”,其中限制可以是兴趣列表(枚举),体验(年份范围)或isVerified(布尔值)等。我有另一个类有财产[限制]?。
我正在考虑使用枚举,但我不确定构建此枚举的正确/更好的方法是什么?或者也许使用struct?有什么建议吗?
答案 0 :(得分:3)
你不清楚是什么"限制"对你来说意味着,但决定的方法是大声说出它的含义,然后用语法来挑选你的类型。
结构是" AND"类型。例如:
struct Point {
let x: Double
let y: Double
}
Point具有x坐标和y坐标。如果限制具有兴趣,经验水平和验证状态,那么这就是结构。
枚举是一个" OR"类型。例如:
enum Color {
case red
case blue
case green
}
颜色为红色或蓝色或绿色。枚举案例也可能包含相关数据。例如:
enum Pattern {
case solid(Color)
case striped(Color, Color)
}
图案可以是单色的实体,也可以是两种颜色的条纹。再次注意语法,这有助于我们识别我们的类型:" x与y或a与b。"
结构,类和元组都是AND类型,因此您需要更多规则来拆分它们。元组基本上是匿名结构,它们在Swift中主要用于短期的临时值,如返回值。如果您发现自己想要为元组创建typealias
,则可能需要一个结构。我发现人们过度使用元组(在Swift中;它们在其他语言中更有意义)。
结构是值类型,而类是引用类型。理解差异的最佳方法是值类型仅其值。任何"实例"数字4与任何其他数字4的实例相同。没有"拥有"数字4.你不关心4号来自哪里。这是一个价值。 Point也是如此。点(1,2)完全由数字1后跟数字2定义。关于该点,没有其他任何你可以说的。如果您的类型完全由其属性定义,那么结构就是一个很好的例子。定义两个值之间的相等应该很容易。
类是引用类型。引用类型具有标识。两个实例可能具有所有相同的属性值,但可以是不同的对象。"如果你想问一下这是哪一个?"那么你的意思是一个类,而不是一个结构。如果你想确保两个变量是"同一个对象" (而不仅仅是"等于"),那么你的意思是一个阶级。 Swift使用结构有很大的压力,但在实践中,类非常常见,特别是在iOS开发中。
考虑您的类型的含义,并用清晰的语言说出来,将帮助您找到适合您问题的类型。如果您对较长版本感兴趣,请参阅Learning From Our Elders。
编辑:看看你的编辑,我认为你真正构建的是一个谓词。谓词只是一个返回yes或no给定某个值的函数,而这就是我认为Restriction可能是什么。看起来你想要一系列限制。我假设你想和他们在一起。
构建谓词的一个非常好的方法是使用闭包。例如:
struct Element {
let interests: [String]
let experience: Int
}
struct Restriction {
let passes: (Element) -> Bool
init(hasInterest interest: String) {
passes = { $0.interests.contains(interest) }
}
init(hasAtLeastExperience years: Int) {
passes = { $0.experience >= years }
}
}
let element = Element(interests: ["fishing", "sewing"], experience: 5)
let restriction = Restriction(hasAtLeastExperience: 2)
restriction.passes(element)
通过这种方式,您可以轻松地建立限制组,使用AND或OR等来应用它们。
答案 1 :(得分:2)
在你的情况下使用Struct
,因为Structs
是相对较小且可复制的,因为复制比对类相同的实例进行多次引用更安全。您的interest
可以是enum
类型Interest
的列表。
enum Interest {
}
struct Restriction {
let interest: [Interest]
let experience: Int
let isVerified: Bool
}