Swift - 类扩展(extension)

news/2024/6/18 4:11:11 标签: swift
(本文代码已升级至swift3)

Swift语言的类扩展是一个强大的工具,我们可以通过类扩展完成如下事情:
1,给已有的类添加计算属性和计算静态属性
2,定义新的实例方法和类方法
3,提供新的构造器
4,定义下标脚本
5,是一个已有的类型符合某个协议
(注意:扩展只能添加新的计算型属性,不能添加存储型属性,也不能添加新的属性监视器)

示例1:给字符串String类添加下标脚本,支持索引访问
swift">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
swift plain">extension swift color1">String
swift plain">{
swift spaces">     swift plain">subscript(start: swift color1">Int swift plain">, length: swift color1">Int swift plain">) -> swift color1">String
swift spaces">         swift plain">{
swift spaces">         swift keyword">get swift plain">{
swift spaces">             swift keyword">let swift plain">index1 = swift keyword">self swift plain">.index( swift keyword">self swift plain">.startIndex, offsetBy: start)
swift spaces">             swift keyword">let swift plain">index2 = swift keyword">self swift plain">.index(index1, offsetBy: length)
swift spaces">             swift keyword">let swift plain">range = swift color2">Range swift plain">(uncheckedBounds: (lower: index1, upper: index2))
swift spaces">             swift keyword">return swift keyword">self swift plain">.substring(with: range)
swift spaces">         swift plain">}
swift spaces">         swift keyword">set swift plain">{
swift spaces">             swift keyword">let swift plain">tmp = swift keyword">self
swift spaces">             swift keyword">var swift plain">s = swift string">""
swift spaces">             swift keyword">var swift plain">e = swift string">""
swift spaces">             swift keyword">for swift plain">(idx, item) swift keyword">in swift plain">tmp.characters.enumerated() {
swift spaces">                 swift keyword">if swift plain">(idx < start)
swift spaces">                 swift plain">{
swift spaces">                     swift plain">s += swift string">"\(item)"
swift spaces">                 swift plain">}
swift spaces">                 swift keyword">if swift plain">(idx >= start + length)
swift spaces">                 swift plain">{
swift spaces">                     swift plain">e += swift string">"\(item)"
swift spaces">                 swift plain">}
swift spaces">             swift plain">}
swift spaces">             swift keyword">self swift plain">= s + newValue + e
swift spaces">         swift plain">}
swift spaces">     swift plain">}
swift spaces">     swift plain">subscript(index: swift color1">Int swift plain">) -> swift color1">String
swift spaces">         swift plain">{
swift spaces">         swift keyword">get swift plain">{
swift spaces">             swift keyword">return swift color1">String swift plain">( swift keyword">self swift plain">[ swift keyword">self swift plain">.index( swift keyword">self swift plain">.startIndex, offsetBy: index)])
swift spaces">         swift plain">}
swift spaces">         swift keyword">set swift plain">{
swift spaces">             swift keyword">let swift plain">tmp = swift keyword">self
swift spaces">             swift keyword">self swift plain">= swift string">""
swift spaces">             swift keyword">for swift plain">(idx, item) swift keyword">in swift plain">tmp.characters.enumerated() {
swift spaces">                 swift keyword">if swift plain">idx == index {
swift spaces">                     swift keyword">self swift plain">+= swift string">"\(newValue)"
swift spaces">                 swift plain">} swift keyword">else swift plain">{
swift spaces">                     swift keyword">self swift plain">+= swift string">"\(item)"
swift spaces">                 swift plain">}
swift spaces">             swift plain">}
swift spaces">         swift plain">}
swift spaces">     swift plain">}
swift plain">}
 
swift keyword">var swift plain">str = swift string">"hangge.com"
swift functions">print swift plain">(str[7,3])
swift functions">print swift plain">(str[7])
 
swift plain">str[7,3] = swift string">"COM"
swift plain">str[0] = swift string">"H"
 
swift functions">print swift plain">(str[0,10])
运行结果如下: 
原文:Swift - 类扩展(extension)


示例2:给Double增加mm,cm等方法,进行进制转换
swift">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
swift plain">extension swift color1">Double
swift plain">{
swift spaces">     swift keyword">func swift plain">mm()-> swift color1">String
swift spaces">     swift plain">{
swift spaces">         swift keyword">return swift string">"\(self/1)mm"
swift spaces">     swift plain">}
swift spaces">     swift keyword">func swift plain">cm()-> swift color1">String
swift spaces">     swift plain">{
swift spaces">        swift keyword">return swift string">"\(self/10)cm"
swift spaces">     swift plain">}
swift spaces">     
swift spaces">     swift keyword">func swift plain">dm()-> swift color1">String swift plain">{
swift spaces">         swift keyword">return swift string">"\(self/100)dm"
swift spaces">     swift plain">}
swift spaces">     
swift spaces">     swift keyword">func swift plain">m()-> swift color1">String
swift spaces">     swift plain">{
swift spaces">         swift keyword">return swift string">"\(self/1000)m"
swift spaces">     swift plain">}
swift spaces">     swift keyword">func swift plain">km()-> swift color1">String
swift spaces">     swift plain">{
swift spaces">         swift keyword">return swift string">"\(self/(1000*1000))km"
swift spaces">     swift plain">}
swift plain">}
 
swift keyword">let swift plain">value = 2000000000.0
swift functions">print swift plain">(value.mm())
swift functions">print swift plain">(value.cm())
swift functions">print swift plain">(value.dm())
swift functions">print swift plain">(value.m())
swift functions">print swift plain">(value.km())
运行结果如下:
原文:Swift - 类扩展(extension)

http://www.niftyadmin.cn/n/1382690.html

相关文章

[vue-router] uncaught error during route navigation

vue路由在加载组件之前会执行一些逻辑&#xff0c;尤其是生命周期的钩子函数 如果你在以上的钩子函数中&#xff0c;写了自己的逻辑&#xff0c;并报错了。就会触发[vue-router] uncaught error during route navigation这个错误。 原因是vue进行了try catch&#xff0c;会捕…

dajango 模板中 js 使用服务器返回的数据

var data "{{ line|safe }}"明确告诉django不要逃避该变量的输出Django的模板中会对HTML标签和JS等语法标签进行自动转义&#xff0c;原因显而易见&#xff0c;这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义&#xff0c;比如我们做一个内容管理系统…

Reddit重写其iOS应用,改进性能、模块化和测试

去年&#xff0c;Reddit一直在努力改进其iOS应用的性能&#xff0c;同时使其适合更快的迭代周期&#xff0c;改善其测试覆盖率&#xff0c;提高其可扩展性。所有这些都是通过把应用原来的MVC架构改造成Model-View-Presenter&#xff08;MVP&#xff09;架构实现的。\\原来的MVC…

关于java中string的内存位置

java运行时内存分五部分&#xff1a; 线程共享&#xff1a;堆内存、方法区&#xff08;包括常量池&#xff09; 线程私有&#xff1a;栈内存、本地方法栈、程序计数器 string不是基本数据类型&#xff0c;那么一个string的内存位置是什么呢&#xff1f;一共有两种情况&#xff…

eslint的几种检测级别-syntax、problem、code style

JS作为一门动态类型的语言&#xff0c;在给开发者带来便利的同时&#xff0c;也不可避免的引起一些潜在问题。简单来说&#xff0c;它需要你在编程的时候充分的了解当前对象是否有你要使用的方法或者属性。 然后人脑毕竟是有限的。所以就需要一些手段帮你找到潜在的问题。这种…

配置fileupload(文件上传组件)

<properties><commons-fileupload.version>1.3.1</commons-fileupload.version> </properties><dependencyManagement><dependencies><!-- 文件上传组件 --><dependency><groupId>commons-fileupload</groupId>&l…

Docker逻辑数据流

最近在研究Docker,一种新的轻型虚拟化技术&#xff0c;个人觉得这是以后虚拟化的方向。从目前企业级及开源社区关于虚拟化的应用及关注方向&#xff0c;大多数使用重虚拟化技术&#xff0c;即在Hypervisor上为每个应用虚拟guest OS,对于guest OS&#xff0c;除了应用程序需要使…

PHP 的 preg_match 和 preg_match_all

preg_match为仅输出一个匹配结果 preg_match_all为输出全部匹配结果 <?php $tt<img src"/GTicket/Public/kindeditor/php/../attached/image/20160510081224_31958.png" alt"" /> <img src"http://s1.dwstatic.com/group1/M00/8F/DF/923…