struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// the range represents integer values 0, 1, and 2
rangeOfThreeItems.firstValue = 6
// the range now represents integer values 6, 7, and 8
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// this range represents integer values 0, 1, 2, and 3
rangeOfFourItems.firstValue = 6
// this will report an error, even though firstValue is a variable property
// 如果被標(biāo)記為 lazy 修飾符的屬性同時被多個線程訪問并且屬性還沒有被初始化,則無法保證屬性只初始化一次。
class DataImporter {
/*
DataImporter is a class to import data from an external file.
The class is assumed to take a non-trivial amount of time to initialize.
*/
var fileName = "data.txt"
// the DataImporter class would provide data importing functionality here
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
// the DataManager class would provide data management functionality here
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// the DataImporter instance for the importer property has not yet been created
print(manager.importer.fileName)
// the DataImporter instance for the importer property has now been created
// prints "data.txt"
// get set (rect 結(jié)構(gòu)體)
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 initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// prints "square.origin is now at (10.0, 10.0)"
//簡寫
struct AlternativeRect {
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 {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
// 只讀計算屬性
// 你可以通過去掉 get 關(guān)鍵字和他的大擴(kuò)號來簡化只讀計算屬性的聲明:
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// prints "the volume of fourByFiveByTwo is 40.0"
//屬性觀察者(過濾器)
// kvc~~~~~~牛逼
// willSet 會在該值被存儲之前被調(diào)用蚀狰。
// didSet 會在一個新值被存儲后被調(diào)用。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps
全局和局部變量
//全局敞亮和變量永遠(yuǎn)是延遲計算的,與延遲存儲屬性有著相同的行為盹憎。不同于延遲存儲屬性,全局常量和變量不需要標(biāo)記 lazy 修飾符铐刘。
//上邊描述的計算屬性和觀察屬性的能力同樣對全局變量和局部變量有效陪每。全局變量是定義在任何函數(shù)、方法镰吵、閉包或者類型環(huán)境之外的變量檩禾。局部變量是定義在函數(shù)、方法或者閉包環(huán)境之中的變量疤祭。
類型屬性(類屬性?)
// 不同于存儲實例屬性盼产,你必須總是給存儲類型屬性一個默認(rèn)值。這是因為類型本身不能擁有能夠在初始化時給存儲類型屬性賦值的初始化器勺馆。
// 存儲類型屬性是在它們第一次訪問時延遲初始化的戏售。它們保證只會初始化一次,就算被多個線程同時訪問草穆,他們也不需要使用 lazy 修飾符標(biāo)記
語法
//static 關(guān)鍵字來開一類型屬性灌灾。對于類類型的計算類型屬性,你可以使用 class 關(guān)鍵字來允許子類重寫父類的實現(xiàn)
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 1
}
}
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 27
}
class var overrideableComputedTypeProperty: Int {
return 107
}
}
// 查詢和設(shè)置
print(SomeStructure.storedTypeProperty)
// prints "Some value."
SomeStructure.storedTypeProperty = "Another value."
print(SomeStructure.storedTypeProperty)
// prints "Another value."
print(SomeEnumeration.computedTypeProperty)
// prints "6"
print(SomeClass.computedTypeProperty)
// prints "27"