结构体和类
5.3结构体(struct)
知识点: swift会自动会结构体的成员变量添加初始化方法
。如下:
struct Point {
var x:Int
var y:Int
}
let p = Point(x: 1, y: 1)
///因为是指语义,所以用let定义结构体变量时,无法去改变变量的属性
p.x = 10 //error
tips: 如若有一个经常使用的结构体值,可以以静态属性定义在扩展内
,如下
extension Point {
static let origin = Point(x:0, y:0)
}
Point.origin
结构体中还能包含其他结构体属性
, 这和类里面的使用其他类的实例做属性一样。
知识点2:我们拿一个结构体当属性,并重写didSet方法,当这个结构体属性的一个属性被改变时这个结构体的didSet方法就会被触发
。(看起来好绕,直接看下面代码吧~)
var xPoint = Point(x: 8, y: 0){
didSet{
print("哇哦~我被调用了")
}
}
xPoint.x = 10//哇哦~我被调用了
被调用的原因: 结构体的某个深层次的属性被改变时,等于是改变了结构体,重新为它赋值
。so didSet会被调用。
知识点3:在swift中 Array是结构体 当改变数组中某个元素的属性时 数组的didSet也会被调用。
操作符重载
将两个结构体相加,可以对+操作符进行重载
static func +(lhs: Point, rhs: Point)-> Point{
return Point(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
let y = Point(x: 10, y: 1) + Point(x: 1, y: 10) ///Point(x: 11, y: 11)
///这里的重载为嘛会用static
查资料还没有查到,知道的同学可以补充上来 thx~
知识点4:struct中如果需要改变self,或者需要改变self中任何属性
。 则需要使用mutating
关键字
extension Point {
mutating func translateY(by offset: Int) {
///这里的y实质上等于是self.y
y = y + offset
}
}
mutating 关键字的作用就是标记self是可以改变的
就好像把let 改成了 var
知识点5:swift会自动将属性的setter
标记为mutating
知识点6:很多情况下 一个方法会有可变和不可变的区分
如数组的
sort()
是可变方法
sorted()
不可变方法会返回一个新的数组。
swift中还有很多类似的方法。(感觉这里可以出一个很好的面试题,说说两个方法的区别。)
了解mutating关键字
了解mutating关键字要先了解inout
行为。
func triple(x:Int){
x = x * 3 //error x is let
}
///inout 关键字可以将原来的值覆盖
func triple( x:inout Int) {
x = x * 3 // ojbk
}
mutating 关键字实质上就是隐式的将self标记成inout了
cool~
所以我们就明白为什么 重载 +=
左边的参数会被标记成inout
了。(划重点 这个可以当成面试题。)
网友评论