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

简介: <span style="font-family:宋体;font-size: 10.5pt; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: A
原创文章,欢迎转载。转载请注明:关东升的博客

 

可以在原始类型上扩展计算属性,包括实例计算属性和静态计算属性。添加计算属性的定义,与普通的计算属性的定义是一样的。

实例计算属性示例:在网络编程时,为了减少流量,从服务器端返回的不是信息描述,而是编码,然后在本地再将编码转换为描述信息。为此定义了如下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类型的变量interest2interestBy2是变异方法,它会直接改变变量interest2的值,因此interest2.interestBy2()语句调用完成后,变量interest2的值就改变了。

调用interestBy3方法计算利息,它是静态方法,调用它需要以“类型名.”的方式即“Double.”的方式调用。

 

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
 

更多精品iOSCocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php

 

目录
相关文章
|
10月前
|
存储 Swift iOS开发
31 Swift 继续聊聊协议扩展
Swift 继续聊聊协议扩展
75 0
|
10天前
|
存储 编译器 Swift
Swift笔记:Swift中的扩展语法
Swift笔记:Swift中的扩展语法
20 1
|
2月前
|
存储 Swift 索引
Swift开发——索引器扩展
扩展用于向已存在的类型(例如,类、结构体、枚举和协议等)中添加新的功能,扩展甚至可以向系统类型(包括无法查阅代码的类型)中添加新的功能,但是扩展不能覆盖原类型中已有的方法,扩展也不能向类中添加新的存储属性。
41 6
Swift开发——索引器扩展
|
2月前
|
存储 Swift
Swift开发——属性检查器
Swift中的属性检查器(willSet, didSet)允许在设置存储属性值前后执行代码。在类`Circle`中,属性`radius`使用属性观察器:willSet在赋值前检查值,若值为负则打印警告;didSet在赋值后比较新旧值,根据变化输出相应信息。在实例`c`中,`radius`从-5变为0时,输出“Input value is negative.”和“The circle gets smaller.”;从0变为10时,输出“Input value is normal.”和“The circle gets larger.”。
188 4
Swift开发——属性检查器
|
2月前
|
存储 程序员 Swift
Swift开发——存储属性与计算属性
Swift推荐使用结构体进行开发,结构体支持属性和方法,且作为值类型。结构体属性包括存储属性(如radius)和计算属性(如r),计算属性不存储值,类似方法。结构体用`struct`定义,命名遵循大驼峰规则。实例名遵循小驼峰规则。属性可在结构体中任意位置定义,静态属性用`static`。存储属性可为`lazy`实现懒加载。结构体实例通过`.`访问属性和方法,静态属性和方法用`结构体名.`访问。计算属性可读写,可通过`get`和`set`定义。程序段1展示了结构体Point和Circle的属性和方法,包括私有属性、只读计算属性、可读写计算属性及`mutating`方法。
20 0
Swift开发——存储属性与计算属性
|
3月前
|
存储 设计模式 安全
【Swift开发专栏】Swift的扩展与分类
【4月更文挑战第30天】Swift的扩展和枚举分类提供类型添加新功能的灵活性。文章分为三部分:扩展用于为已有类型添加属性、方法等,适用于功能扩展、代码组织;枚举分类定义相关值,支持原始值和关联值,用于状态表示和类型安全选项。扩展和分类在实际开发中应用于类型增强、状态管理及组合使用。了解并掌握这些特性,能提升代码的灵活性和可维护性。更多高级特性和应用值得进一步探索。
37 2
|
3月前
|
安全 Swift iOS开发
【Swift开发专栏】Swift中的属性观察者与KVO
【4月更文挑战第30天】Swift编程语言支持属性观察者(`willSet`和`didSet`)和键值观察(KVO)来响应属性变化。属性观察者在设置前(`willSet`)和设置后(`didSet`)执行代码,可用于数据绑定。KVO是Cocoa/Cocoa Touch中的机制,需`NSObject`子类和`@objc dynamic`属性配合使用。注意在观察者销毁前移除观察,以避免内存问题。示例展示了属性观察者实现简单数据绑定。
51 1
|
3月前
Swift4.0判断本函数是否在其它类有相同的方法
Swift4.0判断本函数是否在其它类有相同的方法
31 0
|
3月前
|
存储 算法 安全
【Swift专题】聊聊Swift中的属性
属性是面向对象语言中非常基础的语法特性,我们讲属性,实际上就是讲与类本身或类实例关联的数据。在面向对象的语言中,类作为重要的数据结构会封装数据与函数,类中的函数我们通常称其为方法,而数据则就是属性。
71 1
|
11月前
|
存储 Swift
Swift属性包装器@propertyWrapper
Swift属性包装器@propertyWrapper
99 0