PART_A 属性简介
存储属性:存储常量(let )或变量(var ),作为实例的一部分. 只能作用于类和结构体
计算属性:计算一个值. 可用于类、结构体、枚举. 必须用 var 声明
类型属性:上述两属性通常与特定类型的实例关联. 该属性可直接作用于类型本身
PART_B 存储属性
案例 struct Range {
var startIndex: Int
let width: Int
}
var range = Range(startIndex: 0,width: 5)
range.startIndex = 3
常量结构体的存储属性
延迟存储属性:lazy var 声明. 第一次被调用时才计算其属性的初始化值
使用场景
当被 lazy 标记的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次 class DataProvider {
var fileName = "data.txt"
}
class DataManager {
lazy var provider = DataProvider()
var data = [String]()
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
print(manager.importer.fileName)
存储属性和实例变量
- Swift 中的属性没有对应的实例变量,属性的后端存储也无法直接访问
PART_C 计算属性(-案例值得琢磨-)
不直接存储值,提供 getter 、setter 来间接获取和设置值
struct Point {
var x = 0.0,y = 0.0
}
struct Size {
var width = 0.0,height = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX,y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
var square = Rect(origin: Point(x: 0.0,y: 0.0),size: Size(width: 10.0,height: 10.0))
let squareCenter = square.center
square.center = Point(x: 15.0,y: 15.0)
print("square.origin is now at ((square.origin.x),(square.origin.y))")
便捷 setter 声明
只读计算属性:只有 getter 没有 setter 的计算属性,总是返回一个值 struct Cuboid {
var width = 0.0,height = 0.0,depth = 0.0
var volume: Double {
return width * height * depth
}
}
let rect1 = Cuboid(width: 4.0,height: 5.0,depth: 2.0)
print("the volume of rect1 is (rect1.volume)")
PART_D 属性观察器
可为除延迟存储属性外的其他存储属性添加
可通过重写属性的方式为继承的属性(存储属性、计算属性)添加
父类的属性在子类构造器中被赋值时,其在父类的观察器会被调用
可为属性添加如下一个或全部观察器
若一个属性的 didSet 观察器里赋值,该值会替代之前设置的值
PATR_E 全局变量和局部变量
定义
注意
计算属性和属性观察器所描述的功能可用于全局变量和局部变量
PART_F 类型属性(static ):定义某个类型所有实例共享的数据
实例属性属特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例间的属性相互独立
必须给存储型类型属性指定默认值(无构造器,无法初始化时赋值)
存储型类型属性是延迟初始化的(省略 lazy ). 即使它们被多个线程同时访问,系统也保证只会对其进行一次初始化
语法 struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 5
}
}
enum SomeEnumeration {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 6
}
}
class SomeClass {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 7
}
class var overrideableComputedTypeProperty: Int {
return 8
}
}
获取和设置类型属性的值
案例:两个喇叭的音量 struct AudioChannel {
static let thresholdLevel = 10
static var maxInputLevelForAllChannels = 0
var currentLevel: Int = 0 {
didSet {
if currentLevel > AudioChannel.thresholdLevel {
currentLevel = AudioChannel.thresholdLevel
}
if currentLevel > AudioChannel.maxInputLevelForAllChannels {
AudioChannel.maxInputLevelForAllChannels = currentLevel
}
}
}
}
var leftChannel = AudioChannel()
var rightChannel = AudioChannel()
leftChannel.currentLevel = 7
rightChannel.currentLevel = 11
以上。如有错误和疑问,欢迎指正提出。 catface.wyh@gmail.com
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|