Swift:Extension和Protocol

一、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变量。而在类中,不需要;因为类中的方法本来就可以修改变量

举个例子:

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.

四、一个类如果实现了两个protocol,并且这两个protocol定义的方法有可能有重名的解决办法

举个例子:

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方法,所以要经过类型转化。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 02:14:00

Swift:Extension和Protocol的相关文章

Swift 协议(protocol)和扩展(extension)

协议 Swift 使用protocol定义协议: 1 protocol ExampleProtocol { 2 var simpleDescription: String { get } 3 mutating func adjust () 4 } 类型.枚举和结构都可以实现(adopt)协议: 1 class SimpleClass: ExampleProtocol { 2 var simpleDescription: String = "A very simple class." v

swift开发之--Protocol(协议)

使用object-c语言的同学们肯定对协议都不陌生,但在swift中苹果将protocol这种语法发扬的更加深入和彻底. Swift中的protocol不仅能定义方法还能定义属性,配合extension扩展的使用还能提供一些方法的默认实现,而且不仅类可以遵循协议,现在的枚举和结构体也能遵循协议了. 基于此本文从 : 1,协议中定义属性和方法, 2,协议的继承.聚合.关联类型, 3,协议的扩展, 4,Swift标准库中常见的协议, 5,为什么要使用协议 5个方面结合自身的学习经验简单介绍一下这种"

Swift协议(Protocol)

协议是为方法.属性等定义一套规范,没有具体的实现. 协议能够被类.结构体等具体实现(或遵守). protocol SomeProtocol { // protocoldefinition goes here } struct SomeStructure: FirstProtocol, AnotherProtocol { // structure definition goes here} class SomeClass: SomeSuperclass, FirstProtocol, Anothe

Objective -C NSDate、Category   、Extension、Protocol

NSDate的使用 NSDate是Cocoa中用于处理日期和时间的基础类,封装类某一给定的时刻,具体的日期,时间和时区 使用+date方法获取当前日期和时间 例如  :NSDate*nowDate = [NSDate date]: 注意,,NSLog(@"%@",nowDate): 无论你是哪个时区的时间,打印时间,打印时总是打印对应的0时区时间 NSTimeinterval NSTimeInterval(即double类型) 用以表示以秒为单位的时间间隔 可以使用-initWithT

xcode6中如何创建category,extension,protocol

我想有很多朋友们也跟我有过这样的疑惑,那就是新的Xcode6如何新建一个category,extension,protocol文件,也有很多人尽管自己去尝试找过了,但是没有找到,而不是Xcode6没有这个功能,而是你不够仔细.今天小农在经过几番寻找,才找到这个创建的方法. 无论是Mac端还是iOS端口,均是选择source下的oc file,如下所示: 选中后点击下一步: 看到了吗,下拉菜单可以选择你想要创建的文件.接下来,还可以选择你的原始类: 到这里,相信大家都明白了.我也不再赘述.

Swift -- enum 继承 protocol

原文地址链接:http://blog.csdn.net/duanyipeng/article/details/32338575 Apple官方文档:The Swift Programming LanguageProtocols and Extensions一节的小节练习,要求自行定义一个enumeration枚举类型,并且遵循ExampleProtocol协议: protocol ExampleProtocol { var simpleDescription: String { get } mu

第七讲.NSDate,category(分类),extension(延展),protocol(协议),delegate(代理)

一.掌握NSDate和NSDateFormatter的使用 NSDate是Cocoa中?用于处理日期和时间的基础类,封装了某一给定的时刻(含日期,时间,时区). 了解NSDate的创建,如何计算当前时间,时间间隔,以及时间日期与字符之间的互转. 1>.NSDate创建,当地时间计算,时间按间隔计算,时间与字符之间的互转 练习题1:计算当前时间与一个固定时间按的时间差 练习二:字符串转化为日期对象 二.掌握Category的定义和使用(只能为类扩展类方法或实例方法) 1.主要作用是为:没有源代码的

窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流>等博客内容中都用到的Delegate回调.说到协议,在Objective-C中也是有协议的,并且Swift中的协议和Objc中的协议使用起来也是大同小异的,在Java等现代面向对象编程语言中有接口(Interface)的概念,其实和Swift中或者Objc中的Protoco

奔五的人学IOS:Swift中的protocol及其应用实例

最近在学习ios抓取网页内容时遇到各种重复代码的问题,看着这么多重复的代码,感觉实在不爽,于是学习了ios的protocol. 在我看来这个protocol其实应该是Java中的interface. 也就是定义一个协议(或者叫接口),定义一堆方法,让实现了该方法的类的实例传入即可. 在我的工程中,抓取不同网页的viewcontroller,获取网页的代码完全是一模一样的,除了网址不同以外,别无二致,所以这一部分提取出来作为一个类,专门实现上网取数据,数据取到了需要通知viewcontroller