结构体 & 类

2019-06-28  本文已影响0人  曹来东
struct Date {
    var year: Int
    var month: Int
    var day: Int
}
var date = Date(year: 2019, month: 6, day: 28)

结构体初始化器


struct Point {
    var x: Int = 0
    var y: Int = 0
}

let p1 = Point(x: 10, y: 10);
let p2 = Point(x: 10)
let p3 = Point(y: 9)
let p4 = Point()
struct Point {
    var x: Int?
    var y: Int?
    
}
var p1 = Point(x: 10, y: 1)
var p3 = Point(x: 4)
var p3 = Point(y: 4)
var p4 = Point()

以上代码可以在Xcode11上编译通过.因为每个成员变量都有初始值nil

结构体内存

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

class Point {
    var x: Int = 0
    var y: Int = 0
}
let p4 = Point()
let p1 = Point(x: 10, y: 10);
let p2 = Point(x: 10)
let p3 = Point(y: 9)
image.png
image.png

类的初始化器

class Point {
    var x: Int
    var y: Int 
    init() {
        x = 0
        y = 0
    }
}
let p4 = Point()


class Point {
    var x: Int = 0
    var y: Int = 0
}
let p4 = Point()

以上代码是完全等效的。

结构体与类的本质区别

struct Point {
    var x: Int = 3
    var y: Int = 4
}
class Size {
    var width = 1
    var height = 2
}
func test() {
    var size = Size()
    var point = Point()
}
image.png

类的存储在堆空间,其中存储着类的 类型信息,引用计数 和成员变量的值。

值类型

struct Point {
    var x: Int = 3
    var y: Int = 4
}

func test() {
    var p1 = Point(x: 10, y: 1)
    var p2 = p1
}
image.png
p2.x = 99
p2.y = 777
//修改p2对p1没有影响,因为是两个完全独立的内存操作

值类型的赋值操作

var s1 = "Jack"
var s2 = s1
s2.append("_Rose")
print(s1)//Jack
print(s2)//Jack_Rose

var a1 = [1,2,3]
var a2 = a1
a2.append(4)//[1,2,3,4]
a1[0] = 2//[2,2,3]
print(a1)//[2,2,3]
print(a2)//[1,2,3,4]

var d1 = ["max" : 10, "min" : 2]
var d2 = d1
d1["Other"] = 7
d2["max"] = 12
print(d1)//["max" : 10, "min" : 2,"Other" : 7]
print(d2)//["max" : 12, "min" : 2]

引用类型

class Point {
    var x: Int = 0
    var y: Int = 0
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

func test() {
    let p1 = Point(x: 10, y: 22)
    let p2 = p1
    
    p2.x = 55
    p2.y = 66
    
    print(p1.x)//55
    print(p1.y)//66  
}
image.png

对象的堆空间申请过程

class Point {
    var x = 11
    var y = 22
    var test = true
    
}
var p = Point()
class_getInstanceSize(type(of: p))//40
class_getInstanceSize(Point.self)//40

引用类型的赋值操作

class Size {
    var width: Int
    var height: Int
    init(width: Int,height: Int) {
        self.width = width
        self.height = height
    }
    
}

var s1 = Size(width: 10, height: 20)
s1 = Size(width: 33, height: 55)
image.png

值类型 引用类型的let

class Size {
    var width: Int
    var height: Int
    init(width: Int,height: Int) {
        self.width = width
        self.height = height
    }
    
}

let s1 = Size(width: 10, height: 20)
s1 = Size(width: 33, height: 55)//报错,s1被let修饰不能被修改
s1.width = 33
s1.width = 44

struct Point {
    var x: Int
    var y: Int
}

let p = Point(x: 10, y: 33)
p = Point(x: 00, y: 99)//报错,p被let修饰不能被修改
p.x = 77//报错,p被let修饰不能被修改
p.y = 77//报错,p被let修饰不能被修改
上一篇下一篇

猜你喜欢

热点阅读