Swift:Extension和Protocol

Swift:Extension和Protocol,第1张

概述一、Swift中的扩展功能(Extension)可以动态给类增加功能,类似于Javascript中的prototype; 而在objective-c中,是通过runtime来实现动态调用或者添加功能的。 定义方式如下: extension SomeType {} 1. 单位转换 extension Double { var km: Double {return self * 1000.

一、Swift中的扩展功能(Extension)可以动态给类增加功能,类似于JavaScript中的prototype; 而在objective-c中,是通过runtime来实现动态调用或者添加功能的。

定义方式如下:

extension SomeType {}

1. 单位转换

extension Double {    var km: Double {return self * 1000.0}}

调用的代码如下:

let walk: Double = 25.4;print("25.4千米 =  \(walk.km)米")
最终输出结果为:"25.4千米 = 25400.0米"

从上面的定义可以看出:我们为类型Double扩展了一个只读属性km,所以每次调用的时候,都会将结果乘以1000.0


2. 数字转中文

func getChineseNumber(number: Int) -> String {    let chineseList = "零一二三四五六七八九"    let index = advance(chineseList.startIndex,number)    return String(chineseList[index])}extension Int {    func tochIEseNumber() -> String {        var result: String = ""        var num = self;        while (num > 0) {            result = getChineseNumber(num % 10) + result;            num = num / 10        }        return result;    }}

调用的代码如下:

212332423.tochIEseNumber()
最终输出结果为:"二一二三三二四二三"

从上面的定义可以看出:我们为类型Int扩展了一个方法,这个方法的作用就是将输入的数字转化为中文字符串。


二、Swift中的协议类似于C#中的接口(Interface),但Swift中的协议更强大,协议中不仅可以定义方法,

也可以定义属性;协议不仅可以作用于类,还可以在结构体和枚举中使用。

定义方式如下:

protocol SomeProtocol {    // 协议内容}class SomeClass: SomeSuperClass,SomeProtocol {    // 类的内容}

举个例子:

protocol Fullnamed {    var fullname: String {get}    func greeting() -> String}class Person: Fullnamed {    var fullname: String = ""    init(fullname: String) {        self.fullname = fullname    }    func greeting() -> String {        return "hello " + self.fullname    }}let zhansan = Person(fullname: "张三")println(zhansan.greeting())

注意:协议protocol中定义的相关属性或者方法,实现它的类中,必须实现这些属性和方法。

如,例子中Fullnamed协议,定义了fullname属性和greeting方法。在其实现的类Person中都有实现。

var fullname: String = "" 就是实现了协议Fullnamed中的fullname属性。

init初始化方法进一步对属性fullname赋值。


协议的好处:就是协议中只定义属性或者方法而没有具体的实现,这些实现工作就交给了实现这个协议的类或者结构,枚举等去完成。这样,更有利于代码的抽取及封装。并且通过协议可以实现多态的效果及工厂功能等。


三、Swift mutating关键字修饰方法是为了能在该方法中修改struct或者enum变量。而在类中,不需要;因为类中的方法本来就可以修改变量


@H_403_138@ 举个例子: @H_403_138@
protocol Vehicle {    var numberOfWheels: Int {get}    var color: UIcolor {get set}    mutating func changecolor()}struct MyCar: Vehicle {        let numberOfWheels = 4    var color = UIcolor.redcolor()    mutating func changecolor() {        self.color = UIcolor.graycolor()    }}

协议Vehicle中定义了一个方法changecolor,并且它是用mutating来修饰的。这样的好处就是在实现协议的结构MyCar中的changecolor方法可以直接修改自己成员变量的值了,比如将color成员变量的值初始化为graycolor. @H_403_138@
@H_403_138@ 四、 一个类如果实现了两个 protocol ,并且这两个 protocol 定义的方法有可能有重名的解决办法 @H_403_138@ 举个例子: @H_403_138@
protocol A {    func bar() -> Int}protocol B {    func bar() -> String}class Dog: A,B {    func bar() -> Int {        return 1    }        func bar() -> String {        return "Hello"    }}let instance = Dog()let num = (instance as A).bar()let str = (instance as B).bar()
注意,在调用bar方法的时候,必须指定是那个协议的bar方法,所以要经过类型转化。 @H_403_138@ 总结

以上是内存溢出为你收集整理的Swift:Extension和Protocol全部内容,希望文章能够帮你解决Swift:Extension和Protocol所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1086110.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存