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

时间:2017-06-26 19:41:13

标签: swift struct enums

我正在尝试编写某种数据类型的“限制”,其中限制可以是兴趣列表(枚举),体验(年份范围)或isVerified(布尔值)等。我有另一个类有财产[限制]?。

我正在考虑使用枚举,但我不确定构建此枚举的正确/更好的方法是什么?或者也许使用struct?有什么建议吗?

2 个答案:

答案 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
}