拓展:和oc的拓展方法功能差点儿相同。就是给已经存在的类,结构体。枚举,协议类型添加新的方法

拓展语法:

用extensionkeyword声明:

  1. extension SomeType {
  2. // new functionality to add to SomeType goes here
  3. }

拓展能够:

(1)加入计算型属性和计算属性

(2)提供新的构造器

(3)定义实例方法和类型方法

(4)定义下标

(5)定义和使用嵌套类型

(一)计算型属性

extension Double {

    var km: Double { return self*1_000 }
var m: Double { return self }
var cm: Double { return self/100 }
var mm: Double { return self/1_000 }
var ft: Double { return self/3.28084 } }
        let oneInch = 25.4.km
print("One inch is \(oneInch) meters")
let threeFeet = 3.ft
print("Three is \(threeFeet) meters")

(二)构造器

struct Rect {
var origin = Point()
var size = Size()
} extension Rect {
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}<pre name="code" class="plain"> var someInt = 5
someInt.square()
print(someInt)



//        let defaultRect = Rect()
// let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 3.0, height: 3.0))
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))
print("\(centerRect.origin),\(centerRect.size)")

(三)方法

a.实例方法的栗子

extension Int {
func repetitions(task: () -> Void) {
for _ in 0..<self {
task()
}
} }
     3.repetitions({ print("hello!") })

b,改变实例方法

extension修饰的实例方法能够改变实例本身,正如结构体和枚举。想改变自身的属性和方法,就必须在实例方法前面加mutatingkeyword,好像是从原始实现改变了方法一样

extension Int {
mutating func square() {
self = self * self
}
}
        var someInt = 5
someInt.square()
print(someInt)

someInt.square()实例方法调用后,someInt实例本身发生了改变

(四)下标

拓展能够给已经存在的类型添加下标。以下通过一个Int型栗子给其加入内联下标。这个下标所取的值是从数字右边開始算起的

比方12345[0]返回的值是5

这个算法就是取这个数字某一位上的数。取个位数的话直接%10就好,取十位上的数就是先除10在%10。取百位上的数就是先/100再%10,等等。

。。

所以拓展代码是:

extension Int {

    subscript(var digitIndex: Int) -> Int {
var decimalBase = 1
while digitIndex > 0 {
decimalBase *= 10
--digitIndex
} return (self / decimalBase) % 10
} }

能够随便拿几个数字试试:

        231[0]
534[1]
14597346[3]
print("\(231[0]), \(534[1]), \(14597346[3])",appendNewLine:false)

(五)嵌套

我们能够在已经存在的类,结构体,枚举中拓展嵌套

extension Int {
enum Kind {
case Negative, Zero, Positive
}
var kind: Kind {
switch self{
case 0:
return .Zero
case let x where x > 0:
return .Positive
default:
return .Negative
}
} }
func printIntegerKinds(numbers: [Int]) {
for number in numbers {
switch number.kind {
case .Negative:
print("- ", appendNewline: false)
case .Zero:
print("0 ", appendNewline: false)
case .Positive:
print("+ ", appendNewline: false)
}
}
print("")
}
        printIntegerKinds([3, 19, -27, 0, -6, 0, 7])

swift2.0学习之拓展的更多相关文章

  1. (IOS)Swift2.0 Radio 程序分析

    本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源项目Swift Radio的研究心得. 项目地址:https://github.com/swiftcodex/Swift-Rad ...

  2. [Swift2.0系列]Defer/Guard 基础语法

    1.Defer Swift2.0中加入了defer新语法声明.defer译为延缓.推迟之意.那么在Swift2.0中它将被应用于什么位置呢?比如,读取某目录下的文件内容并处理数据,你需要首先定位到文件 ...

  3. Servlet3.0学习总结——基于Servlet3.0的文件上传

    Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileu ...

  4. solr6.0学习

    solr6.0学习(一)环境搭建准备工作:目前最新版本6.0.下载solr 6.0:Solr6.0下载JDK8 下载jdk1.8:jdk1.8[solr6.0是基于jdk8开发的]tomcat8.0 ...

  5. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  6. 总结swift 1.2适配swift2.0遇到的改变

    swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sor ...

  7. Swift2.0 中的String(三):类型转换

    本系列第三篇,String相关的类型转换.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一 ...

  8. Swift2.0 中的String(二):基本操作

    Swift中的字符串,第二篇,基本操作.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一) ...

  9. Swift2.0 中的String(一):常用属性

    字符串算是平常用的比较多.花样也比较多的一个类型,昨天有空把相关的一些常用操作都写了一遍,总结出来.其实iOS里面的字符串更复杂,还有NSString系列等等,那些API太多将来需要用的时候再慢慢学. ...

随机推荐

  1. ZOJ 3666 博弈 SG函数

    SG函数: 对于任意状态,定义SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S)表示不再S内的最小非负整数 SG(X)=0当且仅当x为必败态. 解: 构造一个有向无环图(树) ...

  2. html表单代码演示

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  3. [转]通过Net Manager 配置Oracle 11g本地监听服务(listener service)

    本文转自:http://blog.csdn.net/mozart_cai/article/details/8596504 [Target] 通过ip address 监听orcl服务,而不是通过loc ...

  4. Jquery课堂上课了,第一节Jquery选择器$

    Jquery是优秀的Javascrīpt框架,$是jquery库的申明,它很不稳定(我就常遇上),换一种稳定的写法jQuery.noConflict();                   jQue ...

  5. html——标签选择器

    交集选择器:标签+类(ID)选择器{属性:值:}.即要满足使用了某个标签,还要满足使用了类(id)选择器. <!DOCTYPE html> <html> <head> ...

  6. dotnetnuke 7.x登录时不跳到站点设置中的指定页

    查源码发现登录按钮有参数,点击跳到登录页或者弹窗登录,真正登录后会根据传参的url反回.因为皮肤对像没有相应参数,所以只能去掉参数.我是用js去的,偷个懒吧.如下所示: <script type ...

  7. Deutsch lernen (16)

    1. die Übertragung, -en 转播,传播 Das Fernsehen sendet eine Übertragung des Fußballspiels. 2. ebenfalls ...

  8. 【sqli-labs】 less59 GET -Challenge -Double Query -5 queries allowed -Variation2 (GET型 挑战 双查询 只允许5次查询 变化2)

    整型的注入 http://192.168.136.128/sqli-labs-master/Less-59/?id=1 or UpdateXml(1,concat(0x7e,database(),0x ...

  9. JS实现随机颜色的3种方法与颜色格式的转化

    JS实现随机颜色的3种方法与颜色格式的转化   随机颜色和颜色格式是我们在开发中经常要用到的一个小功能,网上相关的资料也很多,想着有必要总结一下自己的经验.所以这篇文章主要介绍了JS实现随机颜色的3种 ...

  10. CAD从线型文件加载线型记录(com接口)

    主要用到函数说明: _DMxDrawX::LoadLinetypeFromFile 从线型文件加载线型记录,详细说明如下: 参数 说明 BSTR pszLinetypeFile 线型文件名,支持htt ...