值类型与引用类型,类与结构体的区别
2024-01-25 02:55:31
前言
在 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
在上面的例子中,point1
和 point2
是两个独立的变量,对 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
在上面的例子中,color1
和 color2
是两个独立的变量,对 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
在上面的例子中,person1
和 person2
是两个引用同一个对象的变量,对 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
在上面的例子中,point1
和 point2
是两个独立的变量,对 point2
的修改不会影响 point1
的值。person1
和 person2
是两个引用同一个对象的变量,对 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
是一个类。Point
和 Person
都定义了属性和方法。
结论
类和结构体是两种常见的引用类型,在内存中以指针的形式存在,指向一个存储在堆中的对象。类和结构体都可以存储多个相关的值,都可以定义方法和属性,都可以继承其他类或结构体。
值类型在内存中独立存在,不会影响其他变量的值。值类型包括结构体和枚举。
引用类型在内存中以指针的形式存在,指向一个存储在堆中的对象。引用类型的成员变量都是引用类型,这意味着对引用类型变量的修改会影响其他变量的值。
值类型变量的赋值是通过复制值来进行的,引用类型变量的赋值是通过复制指针来进行的。值类型变量的修改不会影响其他变量的值,引用类型变量的修改会影响其他变量的值。