swift2.0学习之拓展

拓展:和oc的拓展方法功能差不多,就是给已经存在的类,结构体,枚举,协议类型增加新的方法

拓展语法:

用extension关键字声明:

  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修饰的实例方法可以改变实例本身,正如结构体和枚举,想改变自身的属性和方法,就必须在实例方法前面加mutating关键字,好像是从原始实现改变了方法一样

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])

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

时间: 2024-10-01 08:07:14

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

swift2.0学习之类型转换

(一)类型转换(type casting) 类型转换是检查类型实例的方式,也是把类型实例作为子类或者父类的方式 主要有三个关键词,is,as?,as!(as),is表示是某种类型(比如父类和子类同时出现,选择父类,就是表示层级比较大的那个类型),as表示的是向下转换(downcast)到子类本身,问号表示可选,叹号表示强拆包 举个例子: class MediaItem { var name: String init(name: String) { self.name = name } } cla

swift2.0学习之类型方法(类方法)

和oc类似,就是通过类本身调用方法,在方法(func)关键字前面用static修饰,如果父类允许子类重载方法,就用关键字class修饰 另外,在swift中你可以为类,结构体,枚举定义类方法,而不像oc,只可以类定义类方法 通过点语法调用类方法,下面举例子说明 首先我们规定一个游戏,可以记录玩家的名字,和玩家的等级(这里就需要一个类型属性),当玩家完成一个等级后,就解锁下一个等级,(这里要判断传进来的等级和玩家完成的最高等级),玩家就用类来表示创建,等级的事用结构体创建 struct Level

swift2.0语言新特性

更多文章关注小编的博客www.goofyy.com/bolg/ 传送门: goofyy技术宅 swift语言是苹果公司在2014年WWDC开发者大会上推出的新的开发语言,时至一年,swift经历了几番变更,在2015年的新过去的开发者的会上,苹果推出swift正式版2.0.并在2015年年底开放源代码,不得不说,这是一件很碉碉的事,其实swift开源的意义对于开发者来讲,主要是可以在更多地平台上面使用swift开发语言开发应用,不得不说,苹果公司也是放了一个大招. 小编也斗胆把自己当做swift

(IOS)Swift2.0 Radio 程序分析

本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源项目Swift Radio的研究心得. 项目地址:https://github.com/swiftcodex/Swift-Radio-Pro 一.界面 在这个项目中一共包含了6个界面控制器,其中包含了5个用于分别显示电台频道(Swift Radio).正在播放(Now Playing View).电台信息(Info View Controller).app信息(Menu View Controller)和app特征及联系邮箱

关东升的《Swift2.0》(暂定名)即将出版

大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我将在11月左右出版,<Swift2.0>(暂定名) ,<Swift2.0>将在<Swift开发指南>第1版的基础上添加Swift2.0的内容,同时摒弃第1版的一些不合理的内容,使得本书更加适合Swift开发者.我将连续发一些Swift2.0的学习笔记,有兴趣者,可以看一下. 附<Swift2.0>(暂定名)此书目录: 1 本书约定 2 第一个Swift

iOS开发——学习总结swift篇&amp;swift 2.0学习与总结一

swift 2.0学习与总结一 一:属性策略(OC中的叫法) strong: 在Swift中是默认的 weak: 通过weak关键词申明 weak var delegate: UITextFieldDelegate? readonly,readwrie 直接通过声明变量var,声明常量let的方式来指明 copy 通过@NSCopying指令声明. 值 得注意的是String,Array和Dictionary在Swift是以值类型(value type)而不是引用类型(reference typ

微软企业库5.0学习笔记(10)ASP.NET模块依赖注入

您可以使用HTTP模块,一个到ASP.NET HttpApplicationState类的扩展,在Global.asax编写代码强制ASP.NET在每一个页面请求时自动注入依赖的对象,就像在ASP.NET Web窗体应用程序中讨论的一样. 下列方法显示了一个合适的方法能够获取PreRequestHandlerExecute事件将它自己注入到ASP.NET的执行流水线,在每个页面请求中通过容器的BuildUp方法运行Http模块,并获取OnPageInitComplete事件.当OnPageIni

一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建搭建好了.net core linux的相关环境,今天就来说说ef core相关的配置及迁移: 简介: Entity Framework(以下简称EF) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,EF Core是Entity

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=