我想减少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
的长度而不必初始化内联的每个变量时,有什么相同的方法?我知道元组是一种方式,还有其他最佳实践吗?
答案 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"
)
如果结构类型没有定义任何自己的自定义初始化程序,则会自动接收成员初始化程序。
如您所见,我将var
替换为let
。
除非您在创建值后需要更改Person
的某些属性,否则我建议您使用let
。否则,您可以自由使用var
。这样编译器就可以防止不必要的更改。
我不知道你的应用程序的业务逻辑,但是如果一个Person必须总是填充所有6个属性,那么就不要让它们成为可选项。否则,每次需要使用Person
值时,编译器将强制您检查该可选项是否具有值。
严重。有些情况下它们很有用,模型值不是其中之一
答案 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
,您将无法改变它。