返回

值类型与引用类型,类与结构体的区别

IOS

前言

在 Swift 中,类型分为值类型和引用类型。值类型在内存中独立存在,不会影响其他变量的值。引用类型在内存中以指针的形式存在,指向一个存储在堆中的对象。类和结构体是两种常见的引用类型。

值类型

值类型在内存中独立存在,不会影响其他变量的值。值类型包括结构体和枚举。

结构体

结构体是一种值类型,可以存储多个相关的值。结构体的成员变量都是值类型,这意味着对结构体变量的修改不会影响其他变量的值。

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

var point1 = Point(x: 10, y: 20)
var point2 = point1

point2.x = 30

print(point1.x) // 10
print(point2.x) // 30

在上面的例子中,point1point2 是两个独立的变量,对 point2 的修改不会影响 point1 的值。

枚举

枚举是一种值类型,可以存储一组相关的值。枚举的成员变量都是值类型,这意味着对枚举变量的修改不会影响其他变量的值。

enum Color {
    case red
    case green
    case blue
}

var color1 = Color.red
var color2 = color1

color2 = .blue

print(color1) // red
print(color2) // blue

在上面的例子中,color1color2 是两个独立的变量,对 color2 的修改不会影响 color1 的值。

引用类型

引用类型在内存中以指针的形式存在,指向一个存储在堆中的对象。引用类型的成员变量都是引用类型,这意味着对引用类型变量的修改会影响其他变量的值。

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

var person1 = Person(name: "John", age: 20)
var person2 = person1

person2.name = "Mary"

print(person1.name) // Mary
print(person2.name) // Mary

在上面的例子中,person1person2 是两个引用同一个对象的变量,对 person2 的修改会影响 person1 的值。

值类型与引用类型变量赋值的异同

异同

  • 值类型变量的赋值是通过复制值来进行的,引用类型变量的赋值是通过复制指针来进行的。
  • 值类型变量的修改不会影响其他变量的值,引用类型变量的修改会影响其他变量的值。

例子

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

var point1 = Point(x: 10, y: 20)
var point2 = point1

point2.x = 30

print(point1.x) // 10
print(point2.x) // 30

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

var person1 = Person(name: "John", age: 20)
var person2 = person1

person2.name = "Mary"

print(person1.name) // Mary
print(person2.name) // Mary

在上面的例子中,point1point2 是两个独立的变量,对 point2 的修改不会影响 point1 的值。person1person2 是两个引用同一个对象的变量,对 person2 的修改会影响 person1 的值。

类和结构体的写法异同

异同

  • 类和结构体都可以存储多个相关的值。
  • 类和结构体都可以定义方法和属性。
  • 类和结构体都可以继承其他类或结构体。

例子

struct Point {
    var x: Int
    var y: Int

    func distanceTo(point: Point) -> Double {
        let dx = Double(x - point.x)
        let dy = Double(y - point.y)
        return sqrt(dx * dx + dy * dy)
    }
}

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func greet() {
        print("Hello, my name is \(name) and I am \(age) years old.")
    }
}

在上面的例子中,Point 是一个结构体,Person 是一个类。PointPerson 都定义了属性和方法。

结论

类和结构体是两种常见的引用类型,在内存中以指针的形式存在,指向一个存储在堆中的对象。类和结构体都可以存储多个相关的值,都可以定义方法和属性,都可以继承其他类或结构体。

值类型在内存中独立存在,不会影响其他变量的值。值类型包括结构体和枚举。

引用类型在内存中以指针的形式存在,指向一个存储在堆中的对象。引用类型的成员变量都是引用类型,这意味着对引用类型变量的修改会影响其他变量的值。

值类型变量的赋值是通过复制值来进行的,引用类型变量的赋值是通过复制指针来进行的。值类型变量的修改不会影响其他变量的值,引用类型变量的修改会影响其他变量的值。