在为我的应用程序定义模型时,我应该将哪些属性声明为可选属性,哪些属性为非可选属性?我需要考虑哪些方面?
E.g我想创建实体Car
。 engine
应该是什么类型的?
struct Car {
let engine: Engine?
}
或
struct Car {
let engine: Engine
init(engine: Engine) {
self.engine = engine
}
}
或
struct Car {
let engine: Engine = Engine()
}
答案 0 :(得分:1)
我们中的许多人(包括我在内)都不熟悉这个问题。
Infact Objective-C(以及许多其他语言,如C,Java 1 ... 7等...)强制使用基本类型(Int,Double,...)的变量始终强>被填充。 而且他们也总是强制引用/指针变量总是可能是nil 。 多年来我们只是适应了这些限制。
最初,许多Swift开发人员使用隐式解包的选项
var something: Something!
这是以与上述编程语言类似的方式声明引用变量的最接近的事情,但这样我们实际上并没有使用Optionals的强大功能。
你必须问自己的问题是
在我的数据域中,此实体是否存在且对此特定属性没有任何价值?
如果答案为否,则该属性应声明为非可选。
示例强>
代表应用用户的User
结构将始终填充username
和password
。
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?
}