在Swift中使用嵌套的初始化器是不好的做法?

Sam*_*her 2 initialization properties ios swift swift3

假设我有一个struct像这样的Swift 设置:

struct User {
    // Properties
    var name: String?
    var username: String!
    var email: String?
}
Run Code Online (Sandbox Code Playgroud)

现在,我看待它的方式,有两种设计初始化程序的方法.

这是第一个:

init(username: String) {
    self.username = username
}

init(username: String, name: String) {
    self.username = username
    self.name = name
}

init(username: String, name: String, email: String) {
    self.username = username
    self.name = name
    self.email = email
}
Run Code Online (Sandbox Code Playgroud)

这是第二个:

init(username: String) {
    self.username = username
}

init(username: String, name: String) {
    self.init(username: username)
    self.name = name
}

init(username: String, name: String, email: String) {
    self.init(username: username, name: name)
    self.email = email
}
Run Code Online (Sandbox Code Playgroud)

哪种更好的做法,甚至有所作为?

vad*_*ian 10

实际上你只需要一个初始化器.

username 似乎是必需的,所以声明它是非可选的.

如果为其他参数提供默认值,则可以省略它们.

struct User {
  // Properties
  var name: String?
  var username : String
  var email: String?

  init(username: String, name: String? = nil, email: String? = nil) {
    self.username = username
    self.name = name
    self.email = email
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将这三种形式与一个初始化程序一起使用

User(username: "Foo")
User(username: "Foo", name: "Bar")
User(username: "Foo", name: "Bar", email:"john@doe.com")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我建议将所有属性声明为非选项.缺少值可以用空字符串表示,您永远不会处理可选绑定或强制解包.

struct User {
  // Properties
  var name, username, email : String

  init(username: String, name: String = "", email: String = "") {
  ...
Run Code Online (Sandbox Code Playgroud)

初始化程序的行为完全相同