美文网首页《从零开始学Swift》学习笔记swift每天写1000字
《从零开始学Swift》学习笔记(Day 50)——扩展计算属性

《从零开始学Swift》学习笔记(Day 50)——扩展计算属性

作者: tony关东升 | 来源:发表于2015-12-21 12:02 被阅读155次

    原创文章,欢迎转载。转载请注明:关东升的博客

    可以在原始类型上扩展计算属性,包括实例计算属性和静态计算属性。添加计算属性的定义,与普通的计算属性的定义是一样的。
    实例计算属性示例:在网络编程时,为了减少流量,从服务器端返回的不是信息描述,而是编码,然后在本地再将编码转换为描述信息。为此定义了如下Int类型扩展:


    extension Int {    //定义Int类型的扩展
        var errorMessage : String { //只读计算属性
            var errorStr = ""
            switch (self) { 
            case -7:
                errorStr = "没有数据。"
            case -6:
                errorStr = "日期没有输入。"
            case -5:
                errorStr = "内容没有输入。"
            case -4:
                errorStr = "ID没有输入。"
            case -3:
                errorStr = "据访问失败。"
            case -2:
                errorStr = "您的账号最多能插入10条数据。"
            case -1:
                errorStr = "用户不存在,请到http://51work6.com注册。"
            default:
                errorStr = ""
            }      
            return errorStr
        }
    }
    let message = (-7).errorMessage  //获得-7编码对应的描述信息
    print("Error Code : -7 , Error Message : \(message)") 


    注意整个-7包括负号是一个完整的实例,因此调用它的属性时需要将-7作为一个整体用小括号括起来。然而,如果是7则不需要括号。
    下面再看一个静态属性的示例:
    struct Account {    //定义Account结构体
        var amount : Double = 0.0               //账户金额
        var owner : String = ""                 //账户名
    }

    extension Account {   //定义Account结构体的扩展静态
        static var interestRate : Double {      //利率 
          return 0.0668
        }
    }

    print(Account.interestRate) //打印输出interestRate属性
    打印输出interestRate属性,访问方式与其他的静态计算属性一样,通过“类型名”加“.”来访问静态计算属性。

    扩展方法
    可以在原始类型上扩展方法,包括实例方法和静态方法。这些添加方法的定义与普通方法的定义是一样的。
    下面先看一个示例:
    extension Double {//定义Double类型的扩展
        static var interestRate : Double = 0.0668 //利率
        func interestBy1() -> Double {  
            return self * Double.interestRate //静态属性利率
        }
        mutating func interestBy2() {  //定义实例方法interestBy2
            self = self * Double.interestRate 
        }
        static func interestBy3(amount : Double) -> Double { //定义静态方法interestBy3
            return interestRate * amount  //返回值是计算利息结果
        }
    }

    let interest1 = (10_000.00).interestBy1() //调用interestBy1方法计算利息
    print("利息1 : \(interest1)")

    var interest2 = 10_000.00 //调用interestBy2方法计算利息
    interest2.interestBy2() 
    print("利息2 : \(interest2)")

    var interest3 = Double.interestBy3(10_000.00) //调用interestBy3方法计算利息
    print("利息3 : \(interest3)")
    代码self = self * Double.interestRate,把计算结果直接赋值给当前实例self。在结构体和枚举类型中给self赋值会有编译错误,需要在方法前面加上mutating关键字,表明这是变异方法。
    调用interestBy1方法计算利息,调用它的实例10_000.00,它的返回值被赋值给interest1常量,这是很常见的调用过程。
    调用interestBy2方法计算利息,我们不能使用10_000.00实例调用,而是需要一个Double类型的变量interest2。interestBy2是变异方法,它会直接改变变量interest2的值,因此interest2.interestBy2()语句调用完成后,变量interest2的值就改变了。
    调用interestBy3方法计算利息,它是静态方法,调用它需要以“类型名.”的方式即“Double.”的方式调用。

    相关文章

      网友评论

      本文标题:《从零开始学Swift》学习笔记(Day 50)——扩展计算属性

      本文链接:https://www.haomeiwen.com/subject/kzzuhttx.html