美文网首页
[swift 进阶]读书笔记-第五章:结构体和类 C5P3_结

[swift 进阶]读书笔记-第五章:结构体和类 C5P3_结

作者: liaoworkinn | 来源:发表于2018-12-28 13:23 被阅读3次

结构体和类

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了。(划重点 这个可以当成面试题。)

文章源文件地址

相关文章

网友评论

      本文标题:[swift 进阶]读书笔记-第五章:结构体和类 C5P3_结

      本文链接:https://www.haomeiwen.com/subject/pmpslqtx.html