Swift系列:结构体

  • 在Swift标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分
  • 比如Bool,Int,Double,String,Array,Dictionary等常见类型都是结构体
        //自定义一个简单的结构体
        struct Date {
            var year: Int
            var month: Int
            var day: Int
        }
        var d1 = Date(year: 2020, month: 9, day: 8)

结构体的初始化器

  • 所有的结构体都有一个编译器自动生成的初始化器(initializer,初始化方法,构造器,构造方法)
  • 编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员都有初始值
//像下边的情况,x有一个默认值,这样编译器会生成两个初始化器,一个是p1的,一个是p2的
        struct Point {
            var x: Int = 1
            var y: Int
        }
        var p1 = Point(y: 2)
        var p2 = Point(x: 1, y: 2)
  • 再看一组情况,默认生成最多初始化器
//四种情况都可以初始化Point
        struct Point {
            var x: Int = 1
            var y: Int = 2
        }
        var p1 = Point(x: 1)
        var p2 = Point(y: 2)
        var p3 = Point()
        var p4 = Point(x: 1, y: 2)
  • 再看一组情况
//在这里,可选项都有个默认值nil,相当于x和y都有初始值nil,所以下边四个初始化器都可以使用
        struct Point {
            var x: Int?
            var y: Int?
        }
        var p1 = Point(x: 1)
        var p2 = Point(y: 2)
        var p3 = Point()
        var p4 = Point(x: 1, y: 2)

自定义初始化器

  • 一旦在定义结构体的时候自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
  • 看一下下边这种情况,自定义了初始化器后,默认的其他几个初始化器就不能使用了
        struct Point {
            var x: Int = 0
            var y: Int = 0
            init(x:Int,y:Int) {
                self.x = x
                self.y = y
            }
        }
        var p1 = Point(x: 1)//报错
        var p2 = Point(y: 2)//报错
        var p3 = Point()//报错
        var p4 = Point(x: 1, y: 2)

结构体的内存结构


        struct Point {
            var x: Int = 0
            var y: Int = 0
        }
        print(MemoryLayout<Point>.size)
        print(MemoryLayout<Point>.stride)
        print(MemoryLayout<Point>.alignment)

        struct Point {
            var x: Int = 0
            var y: Int = 0
            var b = false
        }
        print(MemoryLayout<Point>.size)//17,Int是8个字节,Bool是1个字节,所以这里是17
        print(MemoryLayout<Point>.stride)//24
        print(MemoryLayout<Point>.alignment)//8
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。