swift - 不确定在 swift 中使用什么数据类型

标签 swift struct enums

我正在尝试编写某种数据类型的“限制”,其中限制可以是兴趣列表(枚举)、经验(年份范围)或已验证( 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/

相关文章:

swift - 如何将包集合添加到我的 Xcode 项目中?

swift - 通过 Realm 框架如何快速与网络服务器同步(更新和下载)?

C - 使用 fwrite 在其他结构数组中创建一个结构数组的 bin 文件

struct - 在声明结构字段对象类型时,我必须在这里使用什么样的生命周期参数

c# - 如何根据枚举的类型和字段之一的名称创建枚举的表达式?

swift - NSSearchField:如何隐藏图标和边框?

c++ - C++函数在什么情况下允许缺少模板参数?

angular - 反向映射字符串枚举 Angular 4

Java - 枚举 - 逻辑循环引用

swift - 如何设置当前以外的 DateComponentsFormatter 语言环境?