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.
不要使用 var
如您所见,我将 var
替换为 let
。
除非你需要在创建值后更改 Person
的某些属性,否则我建议你使用 let
。否则您可以自由使用 var
。这样编译器将防止不必要的更改。
不要使用选项
我不知道你的应用程序的业务逻辑,但是如果一个人必须始终填充所有 6 个属性,请不要将它们设为可选。否则每次需要使用 Person
值时,编译器都会强制您检查该可选值是否有值。
不要使用隐式解包选项
说真的。在某些情况下它们很有用,而模型值不是其中之一
我想减少 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.
不要使用 var
如您所见,我将 var
替换为 let
。
除非你需要在创建值后更改 Person
的某些属性,否则我建议你使用 let
。否则您可以自由使用 var
。这样编译器将防止不必要的更改。
不要使用选项
我不知道你的应用程序的业务逻辑,但是如果一个人必须始终填充所有 6 个属性,请不要将它们设为可选。否则每次需要使用 Person
值时,编译器都会强制您检查该可选值是否有值。
不要使用隐式解包选项
说真的。在某些情况下它们很有用,而模型值不是其中之一