Swift 属性与方法详解(五)
- 移动开发
- 7天前
- 7热度
- 0评论
Swift 是一门强大的编程语言,广泛应用于 iOS 和 macOS 应用开发。本文将详细介绍 Swift 中的属性和方法,帮助你更好地理解和应用这些核心概念。无论你是初学者还是有一定经验的开发者,本文都能为你提供有价值的见解和实用技巧。
什么是属性?
在 Swift 中,属性是将值与特定类、结构体或枚举关联的常量或变量。属性可以分为以下几类:
- 存储属性:存储在类或结构体的实例中的值。
- 计算属性:计算并返回一个值,但不存储。
存储属性 vs 计算属性
存储属性
存储属性就像一个容器,用于存储常量或变量,作为类或结构体实例的一部分。存储属性可以是变量存储属性(用 var 关键字定义),也可以是常量存储属性(用 let 关键字定义)。
struct Number {
var digits: Int
let pi = 3.1415
}
var n = Number(digits: 12345)
n.digits = 67
print(n.digits) // 输出 67
print(n.pi) // 输出 3.1415在定义存储属性时,可以指定默认值,也可以在构造过程中设置或修改存储属性的值,甚至修改常量存储属性的值。
struct Number {
var digits: Int
let pi = 3.1415
}
var n = Number(digits: 12345)
n.digits = 67
print(n.digits) // 输出 67
print(n.pi) // 输出 3.1415计算属性
计算属性是一种特殊的属性,用于计算值而不是存储值。计算属性可以用于类、结构体和枚举。
class Sample {
var no = 0.0
}
class Sample {
var no = 0
}在计算属性时,getter 用于获取值,setter 用于设置值。计算属性不存储值,而是计算并返回一个值。
存储属性
存储在类或结构体实例中的值。存储属性用于存储数据,计算属性则用于计算值。
存储属性
存储属性用于存储值,计算属性则用于计算值。
存储属性
存储属性是类或结构体实例中用于存储值的地方。存储属性用于存储值,而计算属性则用于计算值。
存储属性
存储属性用于存储类或结构体实例的值。在 Swift 中,属性可以分为几种类型:
- 存储属性:用于存储值。
- 计算属性:用于计算值,不存储。
示例
class Sample {
var storedProperty = 0
var computedProperty: Int {
get {
return 0
}
set {
print("Computed Property")
}
}
let sample = Sample()
print(sample.computedProperty)类型属性
- 存储属性:存储常量或变量作为实例的一部分。
- 计算属性:计算(而不是存储)一个值。
- 延迟存储属性:当首次访问时才计算其初始值。
延迟存储属性
延迟存储属性是指当首次访问时才计算其初始值的属性。在属性声明前使用 lazy 关键字来标示一个延迟存储属性。
class Sample {
lazy var number = Number(name: "Runoob Swift 教程")
}
class Number {
var name: String
init(name: String) {
self.name = name
}
}
var firstSample = Sample()
print(firstSample.number.name) // 输出 "Runoob Swift 教程"计算属性
计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter 来间接设置其他属性或变量的值。
class Sample {
var no1 = 0.0, no2 = 0.0
var length = 300.0, breadth = 150.0
var middle: (Double, Double) {
get {
return (length / 2, breadth / 2)
}
set(axis) {
no1 = axis.0 - (length / 2)
no2 = axis.1 - (breadth / 2)
}
}
}
var result = Sample()
print(result.middle) // 输出 (150.0, 75.0)
result.middle = (0.0, 10.0)
print(result.no1) // 输出 -150.0
print(result.no2) // 输出 -65.0如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称 newValue。
只读计算属性
只有 getter 没有 setter 的计算属性称为只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。
class Film {
var title = ""
var duration = 0.0
var metaInfo: [String: String] {
return [
"title": self.title,
"duration": "\(self.duration)"
]
}
}
var movie = Film()
movie.title = "Swift 属性"
movie.duration = 3.09
print(movie.metaInfo["title"]!) // 输出 "Swift 属性"
print(movie.metaInfo["duration"]!) // 输出 "3.09"属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值时都会调用属性观察器,即使新的值与当前值相同也不例外。
class SamplePgm {
var counter: Int = 0 {
willSet(newTotal) {
print("计数器: \(newTotal)")
}
didSet {
if counter > oldValue {
print("新增数 \(counter - oldValue)")
}
}
}
}
let newCounter = SamplePgm()
newCounter.counter = 100
newCounter.counter = 800全局变量和局部变量
计算属性和属性观察器的模式也可以用于全局变量和局部变量。
- 局部变量:在函数、方法或闭包内部定义的变量。
- 全局变量:在函数、方法、闭包或任何类型之外定义的变量。
类型属性
类型属性是作为类型定义的一部分写在类型最外层的花括号内。使用 static 关键字定义值类型的类型属性,使用 class 关键字定义类的类型属性。
struct StructName {
static var storedTypeProperty = ""
static var computedTypeProperty: Int {
// 返回一个 Int 值
}
}
enum EnumName {
static var storedTypeProperty = ""
static var computedTypeProperty: Int {
// 返回一个 Int 值
}
}
class ClassName {
class var computedTypeProperty: Int {
// 返回一个 Int 值
}
}获取和设置类型属性的值
类型属性的访问也是通过点运算符进行,但通过类型本身来获取和设置,而不是通过实例。
实例
struct Student {
static var count = 0
static var total = 0
}
print(Student.count) // 输出 0实例
struct Student {
static var count = 0
}
var student = Student()
print(student.count) // 输出 0总结
通过本文,我们深入探讨了 Swift 中的属性及其应用。从存储属性到计算属性,再到属性观察器,每一种属性都有其独特的用途和应用场景。希望本文能帮助你更好地理解和应用这些核心概念,提升你的编程技能。无论是初学者还是有经验的开发者,掌握这些知识都将使你在 Swift 编程中更加得心应手。