06、struct结构体

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值