swift的类型约束
关键词:
类型与功能绑定、类型指定、访问控制。
类型约束的本质:
1、是否强制指定具有某些特征的类型;看类型构造器的定义本身是否对类型有约束;
2、访问控制:类型构造器的功能分为通用功能和约束功能;
通用功能任何实例类型都能访问;
约束功能,只有符合约束的构造实例能够访问。
类型与算法(功能)绑定;对引用类型施加约束,实质上是对构造类型开放了一批底层的功能接口;
类型构造器可以在这些功能接口基础上添加吸纳的功能。
一、术语
类型构造器:含有泛型和关联类型的类型声明定义为类型构造器(kind),或者高阶类型(scala)
引用类型:类型构造器所引用的可指定类型;
实例类型:指定了类型构造器中泛指类型的类型;
约束修饰的访问控制:
只有符合约束的构造实例能够访问(变量和功能);
定制功能:
类型构造器在引用类型的类型约束基础上扩展出来的新功能;
Now that we have a type constructor we can think of several different kinds of them, classified by how many type parameters they take. The simplest – like List[_] – that take a single param have the kind:(* -> *)
https://en.wikipedia.org/wiki/Kind_(type_theory)
二、泛型(关联类型)的运算
1、类型指定;
2、类型约束;
类型约束的潜台词是:被约束类型是泛型或可指定类型;
在swift中只有泛型类型和关联类型能参与类型约束;
类型约束是在类型指定以后检查约束表达式是否合法;
类型指定和类型约束及类型约束检查都是编译器行为;
类型约束只是一个进行合法性检查的表达式,表达式的评估在所有的待定类型指定以后进行。
三、类型约束的形式
1、无约束:按照泛型模式含义,类型构造器的缺省实现是类型无关的,是数据组织和算法的通用部分;
2、固有约束:声明关联类型时附带了约束:
1)指定类型时需要满足类型约束的要求;
2)可以称之为类型约束构,约束为固有属性;可以在此约束基础上扩展出更多的通用功能;
3、通用扩展约束
在约束的基础上扩展了新的功能;新的功能都受到约束的控制。
约束作用于整个构造类型;
符合约束的构造实例才能访问约束修饰的功能。
4、单个功能约束
类型约束作用于单个功能上,
符合约束的构造实例才能访问。
四、约束的作用范围
1、构造器本身对引用的类型有约束:
这个是最强约束,构造实例必须指定符合约束的类型;全局有效;
2、附加约束(扩展约束):构造器的扩展整体对引用类型做了约束;
不符合约束的实例能够访问通用功能;
符合约束的构造类型能够访问本扩展的所有功能;
3、局部约束:
约束作用于单个功能上;
访问控制与上面类似;
五、类型约束的意义
类型与算法是绑定的,对类型做了约束,相当于给构造类型提供了更多的可用功能进行扩展。
每一个(一类)类型都有建立在之上的算法;类型和算法密切相关,每一个类型都有绑定在该类型之上的算法;
对泛型的类型进行指定或约束,意味着该泛型的类型相关性,意味着可以使用关联在该类型相关算法;
这样,类型构造器就能使用关联的该类型上的算法进行定向扩展;
扩展出来的新的功能,泛型和协议具体实现时指定的类型满足约束条件的实现使用;
指定的类型满足约束,可以使用建立在该约束上的功能扩展;
六、总结
构造类型决定了通用功能;
构造类型和引用类型共同决定了扩展功能;
构造类型本身决定了通用功能的访问;
构造类型和引用类型及约束决定了定制功能的访问;
swift的类型约束的更多相关文章
- swift 泛型的类型约束
总结: 1.类型约束只能添加到泛型参量上面 2.关联类型是泛型参量: 3.关联类型可以通过 协议.关联类型名称的形式引用: func allItemsMatch<C1: Container, C ...
- 浅谈Swift集合类型
Swift 的集合表现形式由数组和字典组成.它可以完美的存储任何呢想存储的东西. 数组是一个同类型的序列化列表集合,它用来存储相同类型的不同值.字典也是一个数组,但它的存值方式类似于Map,通过一对一 ...
- Scala 深入浅出实战经典 第81讲:Scala中List的构造是的类型约束逆变、协变、下界详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-97讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第48讲:Scala类型约束代码实战及其在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- C# 零散知识 扩展方法 类型约束
今天看到这么一段代码,我看下面调用了NotifyPropertyChanged定义了两个参数,但是调用的时候只写了一个参数.后来查了下,原来这个是扩展方法的用法, 就是说给T扩展了一个方法Notify ...
- php的类型约束
//如下面的类 class MyClass { /** * 测试函数 * 第一个参数必须为 OtherClass 类的一个对象 */ public function test(OtherClass $ ...
- Swift数字类型之间的转换
Swift数字类型之间的转换Swift是一种安全的语言,对于类型的检查非常严格,不同类型之间不能随便转换.一.整型之间的转换在C和Objective-C等其他语言中,整型之间有两种转换方法:从小范围数 ...
- c# in depth之泛型的类型约束详细
类型约束 1.引用类型约束 这种约束(表示成T:class,必须是为类型参数指定的第一个约束)用于确保使用的类型实参是引用类型,这可能是任何类,接口,数组,委托或者已知是引用类型的另一个类型参数. 例 ...
- swift 可选类型笔记
晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...
随机推荐
- 在ASP.NET MVC应用程序中随机获取一个字符串
在开发ASP.NET MVC应用程序时,有可能需要一个随机字符串,作为密码或是验证码等. 如果你需要的是SQL版本,可以参考<密码需要带特殊字符(二)>http://www.cnblogs ...
- MVC实现更新数据库的数据
经过一系列MVC的练习,如数据库的数据显示,添加,删除等,还差一个功能,就是更新,那本次练习的是MVC对数据库的数据进行更新. 写好更新的存过程: 有了存储过程,可以写实体(Entity)的方法了.写 ...
- Java并发编程-信号量
Semaphore 直译是信号量,它的功能比较好理解,就是通过构造函数设定一个数量的许可,然后通过 acquire 方法获得许可,release 方法释放许可.它还有 tryAcquire 和 acq ...
- HDU6154
CaoHaha's staff Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 【读书笔记】iOS-网络-优化请求性能
一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所能提供的理论带宽是很高的.不 ...
- es6 export与export default 的区别
相同点: 均可用于导出常量.函数.文件.模块等 不同点: 1.在一个文件中export可以有多个,但export default 只能有一个: export var firstName = 'Mich ...
- phpadmin登录报错:#1045 - Access denied for user 'root'@'localhost' (using password: yes)
原因:phpmyadmin无法通过root+密码联系mysql; 解决方法:重置mysql密码. 步骤: 1.cmd 2.登录MySQL:mysql -uroot -p ->root是用户 ...
- OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
上篇文章介绍了什么是OSGI以及使用OSGI构建应用的优点,接着介绍了两款常用的OSGI实现,分别为Apache Felix和Equinox,接下来开始介绍如何在Eclipse中使用Apache Fe ...
- Nginx的常用功能
1.规范nginx的配置文件 在企业中我们的虚拟主机可能会很多,配置文件的内容也会有很多,这时候我们就可以规范一下我们的配置文件,把每个虚拟主机按照网站的域名或者是功能取名,放到统一的文件夹中,当然我 ...
- SVN CentOS7 下配置svn的安装及基础配置介绍
CentOS7 下配置svn的安装及基础配置介绍 by:授客 QQ:1033553122 目录 一. 二. 三. 四. 五. 六. 七. 一. 实践环境 CentOS 7操作系统(CentO ...