Swift:减少Init方法的长度

时间:2016-02-08 20:18:31

标签: swift swift2 ios9

我想减少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")

问题:如何缩短用于创建数据模型类的Obj-C中init?的长度。填充它的变量然后传递整个类,减少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的长度而不必初始化内联的每个变量时,有什么相同的方法?我知道元组是一种方式,还有其他最佳实践吗?

3 个答案:

答案 0 :(得分:3)

只需删除初始化程序!

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

现在您可以使用memberwise初始化程序

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

如果结构类型没有定义任何自己的自定义初始化程序,则会自动接收成员初始化程序。

     

The Swift Programming Language

不要使用var

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

请勿使用Optionals

我不知道你的应用程序的业务逻辑,但是如果一个Person必须总是填充所有6个属性,那么就不要让它们成为可选项。否则,每次需要使用Person值时,编译器将强制您检查该可选项是否具有值。

请勿使用Implicitly Unwrapped Optionals

严重。有些情况下它们很有用,模型值不是其中之一

答案 1 :(得分:1)

使用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")

答案 2 :(得分:0)

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

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

但是,你也可以这样做:

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

就像你以前在ObjC做的一样。请注意,此人被声明为var,因为如果它被声明为let,您将无法改变它。