Created
February 27, 2019 07:30
-
-
Save cyyeh/2fd27ae4b371c3deeb634075a639eb19 to your computer and use it in GitHub Desktop.
Swift Properties
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| Referenced from Stanford CS193p | |
| #: important | |
| ##: very important | |
| Properties | |
| - Stored Properties | |
| - Property Observers | |
| - Global and Local Variables | |
| - #Type Properties | |
| Reference: https://docs.swift.org/swift-book/LanguageGuide/Properties.html | |
| */ | |
| /* | |
| Stored Properties | |
| */ | |
| 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 | |
| // Stored Properties of Constant Structure Instances | |
| 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 | |
| // Lazy Stored Properties | |
| class DataImporter { | |
| /* | |
| DataImporter is a class to import data from an external file. | |
| The class is assumed to take a nontrivial 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" | |
| // If a property marked with the lazy modifier is accessed by multiple threads simultaneously and the property has not yet been initialized, there is no guarantee that the property will be initialized only once. | |
| /* | |
| Property Observers | |
| */ | |
| 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 | |
| /* | |
| #Type Properties | |
| */ | |
| // Type Property Syntax | |
| struct SomeStructure { | |
| static var storedTypeProperty = "Some value." | |
| static var computedTypeProperty: Int { | |
| return 1 | |
| } | |
| } | |
| class SomeClass { | |
| static var storedTypeProperty = "Some value." | |
| static var computedTypeProperty: Int { | |
| return 27 | |
| } | |
| class var overrideableComputedTypeProperty: Int { | |
| return 107 | |
| } | |
| } | |
| // Querying and Setting Type Properties | |
| print(SomeStructure.storedTypeProperty) | |
| // Prints "Some value." | |
| SomeStructure.storedTypeProperty = "Another value." | |
| print(SomeStructure.storedTypeProperty) | |
| // Prints "Another value." | |
| print(SomeClass.computedTypeProperty) | |
| // Prints "27" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment