Swift中用到extension的一些基本的扩展功能讲解

现有的类,结构或枚举类型的功能可以在扩展的帮助下加入。类型的功能可以使用扩展加入,但重写的功能不能使用扩展。

Swift 扩展功能:

  • 添加计算属性并计算类型属性
  • 定义实例和类型的方法
  • 提供了新的初始化
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使现有类型符合协议

扩展用关键字 extension 声明

语法

代码如下:

extension SomeType {
   // new functionality can be added here
}
现有类型也可以用扩展加入使它作为一个协议标准和其语法类似于类或结构。

extension SomeType: SomeProtocol, AnotherProtocol {
   // protocol requirements is described here
}

计算属性
计算“实例”和“type”属性也可以扩展在扩展的帮助下实现。

代码如下:

extension Int {
   var add: Int {return self + 100 }
   var sub: Int { return self - 10 }
   var mul: Int { return self * 10 }
   var div: Int { return self / 5 }
}
   
let addition = 3.add
println("Addition is \(addition)")
   
let subtraction = 120.sub
println("Subtraction is \(subtraction)")
   
let multiplication = 39.mul
println("Multiplication is \(multiplication)")
   
let division = 55.div
println("Division is \(division)")

let mix = 30.add + 34.sub
println("Mixed Type is \(mix)")

当我们使用 playground 运行上面的程序,得到以下结果。

Addition is 103
Subtraction is 110
Multiplication is 390
Division is 11
Mixed Type is 154

初始化器
Swift 能够灵活地通过扩展新的初始化添加到现有的类型。用户可以添加自己的自定义类型来扩展已定义的类型,额外的初始化选项也是可以的。 扩展仅支持 init(). 而 deinit() 不被扩展支持。

代码如下:

struct sum {
   var num1 = 100, num2 = 200
}
  
struct diff {
   var no1 = 200, no2 = 100
}
  
struct mult {
   var a = sum()
   var b = diff()
}
  
let calc = mult()
println ("Inside mult block \(calc.a.num1, calc.a.num2)")
println("Inside mult block \(calc.b.no1, calc.b.no2)")
  
let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100))
 
println("Inside mult block \(memcalc.a.num1, memcalc.a.num2)")
println("Inside mult block \(memcalc.b.no1, memcalc.b.no2)")
  
extension mult {
   init(x: sum, y: diff) {
      let X = x.num1 + x.num2
      let Y = y.no1 + y.no2
   }
}

let a = sum(num1: 100, num2: 200)
println("Inside Sum Block:\( a.num1, a.num2)")
  
  
let b = diff(no1: 200, no2: 100)
println("Inside Diff Block: \(b.no1, b.no2)")

当我们使用 playground 运行上面的程序,得到以下结果。

Inside mult block (100, 200)
Inside mult block (200, 100)
Inside mult block (300, 500)
Inside mult block (300, 100)
Inside Sum Block:(100, 200)
Inside Diff Block: (200, 100)

方法
新实例方法和类型的方法,可以在扩展的帮助下进一步加入到子类。

代码如下:

extension Int {
   func topics(summation: () -> ()) {
      for _ in 0..<self {
         summation()
      }
   }
}

4.topics({
   println("Inside Extensions Block")      
})   
   
3.topics({
   println("Inside Type Casting Block")      
})

当我们使用 playground 运行上面的程序,得到以下结果。

Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Type Casting Block
Inside Type Casting Block
Inside Type Casting Block

topics() 函数使用参数是 (summation: () -> ()) 的类型表示该函数不带任何参数 而且它不会返回任何值。调用该函数多次, 块被初始化,并调用 topic()方法初始化。

不同实例方法变形
实例方法时也可以作为扩展声明的变形。

修改自身的结构和计数的方法或它的属性必须标注实例方法变形,就像是从一个原始的实现变形的方法。

代码如下:

extension Double {
   mutating func square() {
      let pi = 3.1415
      self = pi * self * self
   }
}

var Trial1 = 3.3
Trial1.square()
println("Area of circle is: \(Trial1)")

var Trial2 = 5.8
Trial2.square()
println("Area of circle is: \(Trial2)")

var Trial3 = 120.3
Trial3.square()
println("Area of circle is: \(Trial3)")

当我们使用 playground 运行上面的程序,得到以下结果。

Area of circle is: 34.210935
Area of circle is: 105.68006
Area of circle is: 45464.070735

下标
添加新标已声明实例也可以扩展。

代码如下:

extension Int {
   subscript(var multtable: Int) -> Int {
      var no1 = 1
      while multtable > 0 {
         no1 *= 10
         --multtable
      }
      return (self / no1) % 10
   }
}
   
println(12[0])
println(7869[1])
println(786543[2])

当我们使用 playground 运行上面的程序,得到以下结果。

2
6
5

嵌套类型
嵌套类型为类,结构和枚举实例,也可在扩展的帮助下进行扩展。

代码如下:

extension Int {
   enum calc
   {
      case add
      case sub
      case mult
      case div
      case anything
   }

var print: calc {
      switch self
      {
         case 0:
            return .add
         case 1:
            return .sub
         case 2:
            return .mult
         case 3:
            return .div
         default:
            return .anything
       }
   }
}

func result(numb: [Int]) {
   for i in numb {
      switch i.print {
         case .add:
            println(" 10 ")
          case .sub:
            println(" 20 ")
         case .mult:
         println(" 30 ")
         case .div:
         println(" 40 ")
         default:
         println(" 50 ")

}
   }
}

result([0, 1, 2, 3, 4, 7])

当我们使用 playground 运行上面的程序,得到以下结果。

10
20
30
40
50
50
(0)

相关推荐

  • Swift 3.0基础学习之扩展

    介绍 扩展可以为类,结构体,枚举和协议添加新的功能.包括可以对没有源码访问权限的类型进行扩展.扩展和 Objective-C 分类 的概念类似.(和 Objective-C 的分类不一样的是,Swift 扩展没有名称). 在 Swift 中,扩展可以做到: 添加计算的实例属性和计算的类型属性 定义实例方法和类型方法 提供新的初始化器 定义下标 定义并使用新的嵌套类型 使现有类型符合协议 值得注意的是:扩展可以为类型添加功能,但是不可以重写现有的功能. 扩展语法 使用关键字 extension 定

  • Swift中用到extension的一些基本的扩展功能讲解

    现有的类,结构或枚举类型的功能可以在扩展的帮助下加入.类型的功能可以使用扩展加入,但重写的功能不能使用扩展. Swift 扩展功能: 添加计算属性并计算类型属性 定义实例和类型的方法 提供了新的初始化 定义下标 定义和使用新的嵌套类型 使现有类型符合协议 扩展用关键字 extension 声明 语法 复制代码 代码如下: extension SomeType {    // new functionality can be added here } 现有类型也可以用扩展加入使它作为一个协议标准和

  • Swift实现Selection Sort选择排序算法的实例讲解

    选择排序Selection Sort是一种和插入排序Insertion Sort类似的排序方法,它同样只适用于对规模不大的集合进行排序.它的核心思想是,在序列内部,把序列逻辑上分成已排序和未排序两部分,不断找到未排序部分中最符合排序规则的元素,添加进已排序部分,直到序列中所有元素都已经添加到了已排序部分,此时,整个序列就排序完成了. 冒泡排序是两两比较不断交换来实现排序,所以比较繁琐. 而选择排序  则是先选择要交换的那个数,才去交换.这样就可以省去很多不必要的步骤. Swift版实现示例: f

  • Swift编程中的初始化与反初始化完全讲解

    初始化 类,结构和枚举当 Swift 声明后准备初始化类实例.初始值被初始化为存储属性,并且新的实例的值也被进一步进行初始化.创建初始化函数的关键字是通过 init() 方法.Swift 初始化不同于 Objective-C,它不返回任何值.其作用是检查新创建的实例的其处理前初始化.Swift 还提供了"反初始化"过程中执行的内存管理操作当实例被释放. 对于存储的属性初始化器的作用 存储的属性处理实例之前初始化类和结构的实例. 存储属性使用初始分配和初始化值,从而消除了需要调用属性观察

  • 深入解析Swift代理模式

    配置如下: Xcode 8.2 Swift 3.0 在iOS开发中,无论是 Objective-C 还是 Swift ,Delegate 有着具足轻重的位置,如TabelViewDelegate 与 TableViewDataSource. Swift 中的代理模式 和 Objective-C 除了语法外,几乎一样. Objective-C 代理模式 在介绍 Swift 代理模式前,先来看回顾一下 Objective-C 中的代理模式如何实现 Objective-C 中用代理实现反向传值: 委托

  • Swift面试题及答案整理

    前言 Swift语言至今诞生有一年多的时间了,已经成为当前最流行语言之一.虽然它的语法简单好用,但实际上Swift是一门非常复杂的语言.因为它不仅是面向对象的同时又是函数式编程语言.本文主要介绍Swift常见的一些面试问题,你可以用这些问题向面试者提问,也可以用来测试你自己目前所掌握的Swift知识,如果你不清楚问题答案的话也不用太担心,因为每个问题下面都有相应的答案. 一.给一个数组,要求写一个函数,交换数组中的两个元素 二X程序员: 好简单啊,直接写出以下结果 func swap(_ num

  • Swift中的限定扩展详析

    前言 现在很多公司的iOS新项目都开始用Swift来代替OC开发了,Swift带来的亮点和新功能很多,但我觉得最重要的一点是引导我们编程思想的改变,将我们在OC中用到的传统的面向对象编程思想OOP(object-oriented programming)向面向协议编程思想POP(protocol oriented programming)以及面向值的编程思想VOP(value-oriented programming)上转变,苹果也让我们开发者在编程的时候"从一个protocol开始,别从一个c

  • 深入理解swift变量和函数

    Swift 函数用来完成特定任务的独立的代码块. Swift使用一个统一的语法来表示简单的C语言风格的函数到复杂的Objective-C语言风格的方法. 函数声明: 告诉编译器函数的名字,返回类型及参数. 函数定义: 提供了函数的实体. func getNums()->(Int,Int){ //swift函数可以返回多个变量 return (2,3) } let (a,b) = getNums() //let是常量,一旦赋值后不可改变, var是变量 println(a) //输出 2 var

  • Swift 中闭包的简单使用

    本文主要是介绍Swift中闭包的简单使用,将从"闭包的定义"."闭包的创建.赋值.调用"."闭包常见的几种使用场景","使用闭包可能引起的循环强引用" 四个方面入手,重点介绍闭包如何使用,没有高深的概念,只是专注于实际使用,属于入门级水平,后面还会有关于闭包更加详细和深入理解的文章.希望大家在阅读完本文后能够对闭包有一个整体的理解以及能够简单的使用它. 闭包的定义 在Swift开发文档中是这样介绍闭包的:闭包是可以在你的代码中

  • 详解JS与APP原生控件交互

    "热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显得重要,不可能每次发布一个活动,都要发布一个现版本,当然这样对于Android还算可以,但是对于Ios呢?苹果应用商店每次审核的时间基本都在1~2周,这对于一个促销活动来说审核时间实在太长.而混合式开发正好可以解决这个问题,基本的原理时,通过原生控件实现APP的主体结构,借助H5开发对应的页面,这样每次发布活

  • iOS多语言本地化流程的优化方案

    前言 多语言本地化,是我们在做IOS项目的时候经常用的,下面根据自己的经验和使用场景,来全面的说说多语言本地化的解决方案.本文从提升效率和减少错误两方面对传统的多语言本地化方式进行了优化,虽然标题是iOS,但其实macOS也通用.下面话不多说了,来一起看看详细的介绍吧. 传统的方法 在 Localizable.strings 中写入多种语言的版本,然后使用 NSLocalizedString 进行本地化: # en.lproj/Localizable.strings "login" =

随机推荐