struct的定义和初始化
Swift提供了多种可以结构化存储数据的方式,分别是struct、enum和class。Swift标准库中绝大多数类型都是struct,甚至Foundation中的一些类都提供了它们在Swift中的struct版本,而enum和class只占据了其中份额很小的一部分。
定义struct结构体
struct Human{
var name:String
var sex:String
var age:Int
}
name、sex、age所占用的内存空间决定了Human的大小,所以name、sex、age叫做stored property.
初始化
01、如果你不创建任何init方法,Swift编译器就会为你自动创建一个,让你可以逐个初始化struct中的每一个属性,
Human(name: "lichangan", sex: "male", age: 18)
02、如果我们希望在创建Point对象的时候,可以自动给属性设置默认值.
方法一:
struct Human{
var name:String = "lichangan"
var sex:String = "male"
var age:Int = 18
}
方法二:
struct Human{
var name:String
var sex:String
var age:Int
init(name:String = "lichangan",sex:String = "male",age:Int = 18) {
self.name = name
self.sex = sex
self.age = age
}
}
Type property
对于一个struct经常会使用的“特殊值”,除了每次我们自己定义之外,还可以在struct中定义成type property。它们不是struct对象的一部分,因此,不会增加Point对象的大小。
struct Point{
var x:Int
var y:Int
static let origin = Point(x: 0, y: 0)
}
Point.origin
理解struct的值语义
var pointC = Point(x: 100, y: 100) {
didSet {
print("pointC changed: \(pointC)")
}
}
pointC = pointB
就会在控制台看到:pointC changed: Point(x: 200.0, y: 200.0)的提示。这很好理解,因为我们修改了pointC变量的值。但是,下面这段代码也会触发didSet语句:
pointC.x += 100
即便是字面上我们直接修改了pointC变量的某个属性,但实际执行的逻辑则是我们重新给pointC赋值了一个新的Point对象。
即便是字面上我们直接修改了pointC变量的某个属性,但实际执行的逻辑则是我们重新给pointC赋值了一个新的Point对象。
为struct添加方法
struct可以添加方法,方法是只读的,不可以在方法里面修改对象本身,如果需要修改,可以在结构体前面添加mutating
extension Human {
func introduce() -> String{
return "\(name)" + " \(sex)" + " \(age)"
}
mutating func changeAge(age:Int){
self.age = age
}
Swift编译器就会在所有的mutating方法第一个参数的位置,自动添加一个inout Self参数.
func changeSex(self: inout Self,sex:String){
self.sex = sex
}
}
var man = Human(name: "lichangan", sex: "male", age: 18)
man.changeSex(self: &man, sex: "female")
print(man.sex)