欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Swift入门必知:属性详解(第18篇)

最编程 2024-02-04 16:48:31
...

属性可分为存储属性和计算属性

在这里插入图片描述

18.1 存储属性

存储属性是存储在特定类或结构体的实例里的一个常量或变量,可以在定义存储属性的时候指定默认值,也可以在构造过程中设置或修改存储属性的值

import Cocoa
struct Number {
  var digits: Int
  let pi = 3.14  // 定义存储属性的时候指定默认值
}
var n = Number(digits: 123)  // 构造过程中设置存储属性的值
n.digits = 1234  // 不会报错,构造过程中修改存储属性的值
// n.pi = 3.141  // 会报错,因为pi是常量
print(n.digits)  // 1234
print(n.pi)  // 3.14

18.2 延迟存储属性

延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性,必须将延迟存储属性声明为变量(var关键词),因为常量属性在构造完成之前必须要有初始值。延迟存储属性常用于延时对象的创建、属性的值依赖于其他未知类。

import Cocoa
class Sample {
  lazy var no = Number()  // lazy定义延迟存储属性,且该属性为var
}
class Number {
  var name = "world"
}
var firstSample = Sample()
print(firstSample.no.name)

18.3 计算属性

计算属性不直接存储值,而是提供一个get来获取值,一个可选的set来设置其他属性或变量的值

import Cocoa

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)
result.middle = (0.0, 10.0)  // (150.0, 75.0)
print(result.no1)  // -150.0
print(result.no2)  // -65.0

18.4 只读计算属性

只有get没有set的计算属性为只读计算属性

import Cocoa
class Film {
  var head = ""
  var duration = 0.0
  var metaInfo: [String: String] {
    return [
      "head": self.head,
      "duration": "\(self.duration)"
    ]
  }
}
var move = Film()
move.head = "Swift 属性"
move.duration = 3.09

print(move.metaInfo["head"]!)  // Swift 属性
print(move.metaInfo["duration"]!)  // 3.09

18.5 属性观察器

属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器。可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重载属性的方式为继承的属性添加属性观察器。不需要为无法重载的计算属性添加属性观察器,因为可以通过set直接监控和响应值的变化。(用willSet和didiSet实现属性观察器)

import Cocoa
class Sample {
  var counter: Int = 0 {
    // 先执行willSet,再执行didSet
    willSet(newTotal) { print("计数器:\(newTotal)") }
    didSet {
      if counter > oldValue { print("新增数:\(counter - oldValue)") }  // oldValue为counter的旧值
    }
  }
}
let newCounter = Sample()
newCounter.counter = 100
newCounter.counter = 800

// 结果为:
// 计数器:100
// 新增数:100
// 计数器:800
// 新增数:700

18.6 类型属性

和实例属性区分开,类型属性是类型定义的一部分写在类型最外层的花括号里,使用关键字static定义值类型的类型属性,class定义类类型的类型属性

import Cocoa

struct StudMarks {
  static let markCount = 97
  static var totalCount = 0
  var InternalMarks: Int = 0 {
    didSet {
      if InternalMarks > StudMarks.markCount {
        InternalMarks = StudMarks.markCount
      }
      if InternalMarks > StudMarks.totalCount {
        StudMarks.totalCount = InternalMarks
      }
    }
  }
}

var stud1Mark1 = StudMarks()
var stud1Mark2 = StudMarks()

stud1Mark1.InternalMarks = 98
print(StudMarks.totalCount)  // 获取类型属性

stud1Mark2.InternalMarks = 87
print(StudMarks.totalCount)  // 获取类型属性