zoukankan      html  css  js  c++  java
  • swift 属性

    属性将值和类,结构,枚举相关联。属性分为计算属性和存储属性。存储属性存储常量或变量作为实例的一部分 ,计算属性计算一个值。存储属性用于类和结构体,计算属性用于类,结构体和枚举。

    1:存储属性

    存储属性是存储类或结构体的实例里的一个常量或变量。

    struct Range{
        var length:Int
        let height:Int
    }
    var testRang = Range(length:1, height:2)
    testRang.length = 3

    2:常量和存储属性

    如果将结构体的实例定义为一个常量,则不能修改实例的任何属性。

    struct Range{
        var length:Int
        let height:Int
    }
    let testRang = Range(length:1, height:2)
    //testRang.length = 3 error

    其原因在于结构体(struct)是值类型,其实例被定义成常量后它结构体的所有属性都是常量类型。

    但如果是class类类型,定义成常量后,实例的变量类型依然可以被修改。类是引用类型。

    3:延迟存储属性。@lazy表示一个变量(只能是变量var)声明为延迟存储属性,这样在实例创建时候变量不会创建,只有引用到该变量时候才会创建

    class BigConstructor{
        var strMsg = "big msg"
    }
    
    class CLazyVar{
        @lazy var lazyVar = BigConstructor()
        var strName = "tset"
    }
    
    import Foundation
    var obj = CLazyVar();
    obj.strName = "sx"//lazyVar还没被创建
    println("(obj.strName) (obj.lazyVar)")//这时候才创建

    4:属性和实例变量

    swift语言没有使用变量来做存储,统一使用属性访问。

    5: 计算属性。计算属性提供一个get/set来 获取/改变 其他属性的值

    class CValue{
        var strName:String = "xx"
        var value:String{
        get{
            return strName
        }
        set(newStrName){
            strName += newStrName
        }
        }
    }
    import Foundation
    var obj = CValue()
    obj.value = " oid"
    println("(obj.strName)")

    5.1 便捷set属性,可以使用默认的名字newValue写set属性而不用带括号

    class CValue{
        var strName:String = "xx"
        var value:String{
        get{
            return strName
        }
        set{
            strName += newValue
        }
        }
    }

    5.2只读计算属性。可以只通过get而不用set返回一个只读计算属性。

    class CValue{
        var strName:String = "xx"
        var value:String{
        get{
            return strName
        }
        }
    }
    import Foundation
    var obj = CValue()
    
    println("(obj.strName)")

    6:属性监视器。

    可以为除了延迟存储属性之外的其他存储属性添加属性监视器,也可以通过重载属性的方式 ,为继承的属性(包括存储属性和计算属性)添加属性监视器 。计算属性因为有set实际上就是它的属性监视器了。使用willSet/didSet。

    class CMonitor{
        var strName:String = ""
        {
          willSet(newStrName){
            println("willSet : (newStrName)")
          }
        didSet(newStrName){
            println("didSet:(strName)")
        }
        }
    }
    import Foundation
    var monitor = CMonitor()
    monitor.strName = "sc"
  • 相关阅读:
    Gmail总是把MS发来的信作为垃圾邮件
    添加了CSpreadSheet.h后出现LNK2005错误
    弃用Eudora
    卸载Intel C++ Compiler后Visual C++ 6.0不能工作了
    Matlab对多CPU系统的支持
    Borland决定出售Delphi、JBuilder、C++Builder等IDE产品
    微软提供的免费软件
    生命在于运动?
    "Cannot modify header information"的解决方法
    慢慢的,我们长成了受困于数字的大人
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3885500.html
Copyright © 2011-2022 走看看