我正在尝试编写某种数据类型的“限制”,其中限制可以是兴趣列表(枚举)、经验(年份范围)或已验证( bool 值)等。我有另一个类具有属性 [Restriction]?。
我正在考虑使用枚举,但不确定构建此枚举的正确/更好方法是什么?或者也许使用结构?有什么建议吗?
最佳答案
你不清楚“限制”对你意味着什么,但决定的方法是大声说出它的意思,然后使用语法来选择你的类型。
结构是“AND”类型。例如:
struct Point {
let x: Double
let y: Double
}
一个点有一个 x 坐标和一个 y 坐标。如果限制具有兴趣、经验水平和验证状态,那么这就是一个结构。
枚举是一种“或”类型。例如:
enum Color {
case red
case blue
case green
}
颜色是红色或蓝色或绿色。枚举案例也可能有关联数据。例如:
enum Pattern {
case solid(Color)
case striped(Color, Color)
}
图案要么是单一颜色的纯色,要么是两种颜色的条纹。再次注意帮助我们识别类型的语法:“x with y OR a with b。”
结构体、类和元组都是 AND 类型,因此您需要更多规则来将它们拆分。元组基本上是匿名结构,它们在 Swift 中主要用于短期的临时值,如返回值。如果您发现自己想要为元组创建 typealias
,您可能需要一个结构。我发现人们过度使用元组(在 Swift 中;它们在其他语言中更有意义)。
结构是值类型,而类是引用类型。理解差异的最佳方式是值类型只是它的值。数字 4 的任何“实例”都与数字 4 的任何其他实例相同。没有任何东西“拥有”数字 4。你不关心数字 4 来自哪里。那是一个值(value)。点也是如此。点 (1,2) 完全由数字 1 和数字 2 定义。关于该点,您无话可说。如果您的类型完全由其属性定义,那么这是结构的一个很好的例子。定义两个值之间的相等性应该很容易。
类是引用类型。引用类型具有身份。两个实例可能具有所有相同的属性值,但却是不同的“对象”。当你想问“这是哪一个?”时那么你的意思是一个类,而不是一个结构。如果你想确保两个变量是“同一个对象”(而不仅仅是“相等”),那么你的意思是一个类。在 Swift 中使用结构体的压力很大,但在实践中,类非常普遍,尤其是在 iOS 开发中。
思考您的类型的含义,并用清晰的语言表达出来,将帮助您找到适合您的问题的类型。如果您对此的较长版本感兴趣,请参阅 Learning From Our Elders .
编辑:看看您的编辑,我认为您真正构建的是谓词。谓词只是一个函数,它返回给定某个值的是或否,这就是我认为的限制可能是什么。看起来你想要一组限制。我假设您想然后将它们 AND 放在一起。
构建谓词的一种非常好的方法是使用闭包。例如:
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 等应用它们。
关于swift - 不确定在 swift 中使用什么数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44767468/