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 



相关阅读:
jquery 为a标签绑定click事件示例代码
jquery属性选择器not has怎么写 行悬停高亮显示
Asp.net SignalR快速入门
js实现浏览本地文件并显示扩展名的方法
RedHat系统上基本的网络连接和设置方法
Win10 RTM最终正式版即将诞生:编译版本暂定为Build 10240(图)
JS+CSS实现简易的滑动门效果代码
使用javascript为网页增加夜间模式
Ajax回退刷新页面问题的解决办法
Win10任务栏搜索框怎么开启或者禁用?
实例讲解使用CSS实现多边框和透明边框的方法
CSS3绘制有活力的链接下划线
使用ctop在命令行中检测Linux容器性能
MySQL存储过程的优化实例
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 感动在北京作文400字 书瘾 巧克力城作文500字 青草有爱的味道 你是真的优秀吗 小学2013年语言文字工作计划 麻虎 GSP认证技术求职信范文 宁静的感觉 父亲节的祝福语 变干了的康乃馨 我心中的理想班级 妈妈,我想对你说作文600字 职场男人要讲究衣着装饰原则 《陈情表》公开课第二课时教学设计 聪明的小猫350字 林黛玉的外貌描写,描写林黛玉的句子 致三年后的自己作文 鸿飞冥冥,契阔我心 竹的作文 贾程智《这就是我》 做小实验作文200字 初中初一作文700字:爸爸·妈妈·我 高三之春 花中之贵-------君子兰 有关毅力恒心的名言名句 小学三年级作文300字:春天,你好 毛委员和我们在一起 歌词 串词 朗诵词 书作文1700字 青海湖,梦幻般的湖教案2 刘翔哥哥,加油!400字 精选温馨早安心语摘录,早安心语正能量带图片 联中赏荷情趣浓 项目部“三严三实”教育实践讲话稿 老师错怪了我作文700字 岁月的遗彩 优秀大学生党员事迹材料:在快乐中学习,在积累中成长 学生会干部辞职报告 我的四季初中作文 二年级作文小乌龟 蝴蝶因生命而精彩 我想找到这样的你 美食大会 为了你我付出了很多,为了你我忘了自己的存在 人类地球 我是小书迷作文200字 2016年一年级班主任工作总结 关于做好村干部的心得体会 秋天的优美句子摘抄 激烈的“运动会”

Copyright © 2016 phpStudy |