Swift: 减少 Init 方法的长度

Swift: Reducing the length of Init methods

我想减少 init 方法的长度。

struct Person {

    var id: Int
    var firstName: String
    var lastName: String
    var vehicle: String
    var location: String
    var timeZone: String

    init (id: Int, firstName: String, lastName: String, vehicle: String, location: String, timeZone: String ) {
        self.firstName = firstName
        self.lastName = lastName
        self.vehicle = vehicle
        self.location = location
        self.timeZone = timeZone
    }
}

下面是我正在创建的 Person 实例。我必须传入每个内联变量的值。

let person = Person(id: 22, firstName: "John", lastName: "Doe", vehicle: "Chevy", location: "Dallas", timeZone: "CST")

问题:如何缩小 init? 的长度 在 Obj-C 中,我曾经创建了一个数据模型 class。填充它的变量,然后传递整个 class,减少 init 方法的长度。

Person *person = [Person new];
person.id = 22;
person.firstName = "John";
person.lastName = "Doe";
person.vehicle = "Chevy";
person.location = "Dallas";
person.timeZone = "CST"

Person *person = [Person initWithPerson:person];

在 Swift 中减少 init 的长度而不必初始化每个内联变量的等效方法是什么?我知道元组是一种方式,还有其他最佳实践吗?

就像评论中提到的那样,将为您创建一个初始化程序,它看起来像这样:

Person(id: Int?, firstName: String?, lastName: String?, vehicle: String?, location: String?, timeZone: String?)

不过,您也可以这样做:

var person = Person()
person.id = 100
person.firstName = "Name"
...

就像您以前在 ObjC 中所做的那样。请注意,person 被声明为 var,因为如果它被声明为 let,您将无法改变它。

使用 struct 你实际上不需要初始化器

struct Person {
  var id : Int?
  var firstName: String?
  var lastName: String?
  var vehicle: String?
  var location: String?
  var timeZone: String?
}

var person = Person()
person.id = 22
person.firstName = "John"
person.lastName = "Doe"
person.vehicle = "Chevy"
person.location = "Dallas"
person.timeZone = "CST"

您可以对非可选对象执行相同的操作

struct Person {
  var id = 0
  var firstName = ""
  var lastName = ""
  var vehicle = ""
  var location = ""
  var timeZone = ""
}

还要考虑初始化器声明(只读)常量的好处

struct Person {
  let id : Int
  let firstName : String
  let lastName : String
  let vehicle : String
  let location : String
  let timeZone : String
}

在这种情况下,您必须使用隐式成员初始化器。

let person = Person(id: 22, firstName: "John", lastName: "Doe", vehicle: "Chevy", location: "Dallas", timeZone: "CST")

只需删除初始化程序!

struct Person {
    let id: Int
    let firstName: String
    let lastName: String
    let vehicle: String
    let location: String
    let timeZone: String
}

现在您可以使用成员初始化器

Person(
    id: 87112,
    firstName: "Walter",
    lastName: "White",
    vehicle: "2004 Pontiac Aztek",
    location: "Albuquerque",
    timeZone: "UTC-07:00"
)

Structure types automatically receive a memberwise initializer if they do not define any of their own custom initialisers.

The Swift Programming Language

不要使用 var

如您所见,我将 var 替换为 let。 除非你需要在创建值后更改 Person 的某些属性,否则我建议你使用 let。否则您可以自由使用 var。这样编译器将防止不必要的更改。

不要使用选项

我不知道你的应用程序的业务逻辑,但是如果一个人必须始终填充所有 6 个属性,请不要将它们设为可选。否则每次需要使用 Person 值时,编译器都会强制您检查该可选值是否有值。

不要使用隐式解包选项

说真的。在某些情况下它们很有用,而模型值不是其中之一