Swift小知识点之 结构体

前言

  • 在 Swift 标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分

    • 比如BoolIntDoubleStringArrayDictionary等常见类型都是结构体

       struct Date {
        var year: Int        
        var month: Int
        var day: Int
       }
       var date = Date(year: 2019, month: 6, day: 23)
  • 所有的结构体都有一个编译器自动生成的初始化器(initializer初始化方法构造器构造方法)

    • 在最后一行调用的,可以传入所有成员值,用以初始化所有成员(存储属性,Stored Property)

结构体的初始化器

  • 编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员都有初始值
    struct Point{
        var x: Int
        var y: Int
    }
    
    var p1 = Point(x: 10, y: 20)
    var p2 = Point(y: 20)  //报错 Missing argument for parameter 'x' in call
    var p3 = Point(x: 10)  //报错 Missing argument for parameter 'y' in call
    var p4 = Point()       //报错 Missing argument for parameter 'x' in call

    如果给定一个初始值

    struct Point{
        var x: Int = 10
        var y: Int
    }
    
    var p1 = Point(x: 10, y: 20)
    var p2 = Point(y: 20)
    var p3 = Point(x: 10) //报错 Missing argument for parameter 'y' in call
    var p4 = Point()    //报错 Missing argument for parameter 'y' in call

    如果x 和 y都有初始值的话,就怎么都不会报错了,因为 所有成员都有初始值

    struct Point{
        var x: Int = 10
        var y: Int = 20
    }
    
    var p1 = Point(x: 10, y: 20)
    var p2 = Point(y: 20)
    var p3 = Point(x: 10) 
    var p4 = Point()    

    初始值为nil的话,也可以编译通过,比如下面这种

    struct Point{
        var x: Int?
        var y: Int?
    }
    
    var p1 = Point(x: 10, y: 20)
    var p2 = Point(y: 20)
    var p3 = Point(x: 10) 
    var p4 = Point()    

自定义初始化器

  • 一旦在定义结构体时自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
    struct Point{
        var x: Int = 10
        var y: Int = 20
        init(x: Int, y: Int) {
            self.x = x
            self.y = y
        }
    }
    
    var p1 = Point(x: 10, y: 20)
    var p2 = Point(y: 20) //报错 Missing argument for parameter 'x' in call
    var p3 = Point(x: 10) //报错 Missing argument for parameter 'y' in call
    var p4 = Point()      //报错 Missing argument for parameter 'x' in call

结构体的内存结构

struct Point {
     var x: Int = 0
     var y: Int = 0
     var origin: Bool = true
 }
    
 print(MemoryLayout<Point>.size)      //17
 print(MemoryLayout<Point>.stride)    //24
 print(MemoryLayout<Point>.alignment) //8

是因为内存对齐的缘故,17是因为 实际使用的是 8+8+1 = 17 24 是因为,要内存对齐,8*3 = 24

 

posted on 2021-04-23 10:03  梁飞宇  阅读(100)  评论(0)    收藏  举报