swift - 属性

/*
• 存储属性
• 计算属性
• 属性观察器
• 全局变量和局部变量
• 类型属性
*/

    //存储属性
    //简单来说,一个存储属性就是存储在特定类或结构体实例厘米昂的一个常量或者变量,存储属性可以是变量存储属性(用关键字var定义),也可以是常量存储属性(用关键字let定义)
    //下面的例子定义了一个名为 FixedLengthRange 的结构体,该结构体用于描述整数的范围,且这个范围值在被创 建后不能被修改.
    struct FixedLengthRange {
    
        var firstValue: NSInteger
        let length :NSInteger
    }
    var rangeOfThreeItems = FixedLengthRange(firstValue:0,length:3)
    rangeOfThreeItems.firstValue = 6
    
    //常用结构体的存储属性
    //如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改实例的任何属性,即使有属性被声明为变量也不行:
    let rangeofFourItems = FixedLengthRange(firstValue:0,length:4)
    //该区间表示整数0,1,2,3
    rangeOfThreeItems.firstValue = 6
    
    
    
    //延迟存储属性
    //延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用 lazy 来标示一个延迟存 储属性。延迟属性很有用,当属性的值依赖于在实例的构造过程结束后才会知道影响值的外部因素时,或者当获得属性的初始值需要复杂或大量计算时,可以只在需要的时候计算它。
    
    class DataImporter {
    
        /*
         DataImporter 是一个负责将外部文件中的数据导入的类。 这个类的初始化会消耗不少时间。
         */
        var fileName = "data.txt"
        
    }
    
    class DataManager {
    
        lazy var importer = DataImporter()
        var data = [String]()
        
    }
    
    let manager = DataManager()
    manager.data.append("Some data")
    manager.data.append("Some more data")
    print(manager.importer.fileName)// DataImporter 实例的 importer 属性还没有被创建
    
    //计算属性
    //简化setter声明
    //只读计算属性
    /*只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访 问,但不能设置新的值。*/
    //读计算属性的声明可以去掉   关键字和花括号:
    
    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)")
    // 打印 "the volume of fourByFiveByTwo is 40.0"
    
    //属性观察器
    /*
     • willSet在新的值被设置之前调用
     • didSet在新的值被设置之后立即调用
     */
    
    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
    //全局变量和局部变量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 属性将值跟特定的类、结构或枚举关联。存储属性存储常量或变量作为实例的一部分,而计算属性计算(不是存储)一个值。计算...
    穷人家的孩纸阅读 419评论 0 0
  •  属性:将值与特定的类、结构体或枚举关联; 存储属性:存储常量或变量作为实例的一部分; 计算属性:用于计算一个值(...
    EndEvent阅读 620评论 1 5
  • Swift 属性将值跟特定的类、结构或枚举关联。 属性可分为存储属性和计算属性: 存储属性 计算属性 存储常量或变...
    零度_不结冰阅读 405评论 0 0
  • 什么是属性? 属性将值跟特定的类、结构体或枚举关联。存储属性存储常量或变量为实例的一部分,而计算属性计算(不是存储...
    GY1994阅读 354评论 0 2
  • 据说,《红楼梦》的读者在年轻时多喜欢黛玉、讨厌宝钗,年岁渐长后会转而喜欢宝钗,等到老了又会重新喜欢黛玉。 这分明对...
    海慧98阅读 1,559评论 4 19