在设计域时,首选可选项还是非可选项?

时间:2016-07-20 16:08:04

标签: swift model optional

在为我的应用程序定义模型时,我应该将哪些属性声明为可选属性,哪些属性为非可选属性?我需要考虑哪些方面?

E.g我想创建实体Carengine应该是什么类型的?

struct Car {
    let engine: Engine?
}

struct Car {
    let engine: Engine

    init(engine: Engine) {
        self.engine = engine
    }
}

struct Car {
    let engine: Engine = Engine()
}

1 个答案:

答案 0 :(得分:1)

简介

我们中的许多人(包括我在内)都不熟悉这个问题。

Infact Objective-C(以及许多其他语言,如C,Java 1 ... 7等...)强制使用基本类型(Int,Double,...)的变量始终被填充。 而且他们也总是强制引用/指针变量总是可能是nil 。 多年来我们只是适应了这些限制。

最初,许多Swift开发人员使用隐式解包的选项

var something: Something!

这是以与上述编程语言类似的方式声明引用变量的最接近的事情,但这样我们实际上并没有使用Optionals的强大功能。

我应该何时将模型的属性声明为可选?

你必须问自己的问题是

  

在我的数据域中,此实体是否存在且对此特定属性没有任何价值?

如果答案为,则该属性应声明为非可选

示例

代表应用用户的User结构将始终填充usernamepassword

struct User {
    let username: String
    let password: String
    let profileImageURL: NSURL?
}

另一方面,nil可能有profileImageURL值,因为用户没有上传个人资料图片。

在这种情况下,没有User的{​​{1}}值没有意义,它不会发生,在处理username值时,我们应该始终有保证(由编译器提供)其中有User个值。

因此我们将username设为非可选

这实际上取决于域名

username属性的“可选性”可能因数据域而异。

E.g。这个邮件列表系统实体

Entity

有道理,因为我们无法知道struct Person { let name: String? let email: String } ,但我们肯定知道其name地址。

另一方面,像地址簿这样的另一个上下文中的同一个实体可能变成

email

因为我们可能创建/保存了一张空卡。

规则拇指

作为个人建议,我建议您在对此有疑问时避免使用可选值。如果您声明了非可选属性,那么实际上应该是可选的,问题就会很快出现。

另一方面,如果你声明了一些非可选的可选项,你就永远无法找到它。

重要

当然,永远不要使用属性/变量的域值来表示缺少值

struct Person {
    let name: String?
    let email: String?
}