Swift开发第十二篇——protocol组合&static和class
本篇分为两部分:
一、Swift 中 protocol 组合的使用
二、Swfit 中 static和class 的使用
一、Swift 中 protocol 组合的使用
在 Swift 中我们可以使用 Any 来表示任意类型(public typealias Any = protocol<>),是一个 protocol<>的同名类型,需要实现空接口的接口,其实就是任意类型的意思。
protocol<ProtocolA, ProtocolB, ProtocolC> 等价于
protocol ProtocolD: ProtocolA, ProtocolB, ProtocolC {
//...
}
protocol 组合可以用 typealias 来命名的,于是上面的 ProtocolD 协议可以替换为
typealias ProtocolAll = protocol<ProtocolA, ProtocolB, ProtocolC>
如果某些接口我们只用一次的话,可以直接匿名化
struct ProtocolStruct {
static func test1(pro: protocol<ProtocolA, ProtocolB>) {
//...
}
static func test2(pro: protocol<ProtocolB, ProtocolC>) {
//...
}
}
如果实现多个接口时接口内的方法冲突的话只要在调用前进行类型转换就可以了
protocol A {
func wang() -> Int
}
protocol B {
func wang() -> String
}
class AnClass: A, B {
func wang() -> Int {
return
}
func wang() -> String {
return "强转"
}
}
let instance = AnClass()
let num = (instance as A).wang()
let str = (instance as B).wang()
二、Swfit 中 static和class 的使用
在 Swift1.2及以后,我们可以在 class 中使用 static 来声明一个类作用域的变量:
class MyClass {
static var bar: AnClass?
}
这种写法是合法的,有了这个特性之后,像单例的写法就很简单了
protocol MyProtocol {
static func foo() -> String
}
struct MyStruct: MyProtocol {
static func foo() -> String {
return "MyStruct"
}
}
enum MyEnum: MyProtocol {
static func foo() -> String {
return "MyEnum"
}
}
class TestClass: MyProtocol {
// 在 class 中可以使用 class
class func foo() -> String {
return "TestClass.foo()"
}
// 也可以使用 static
static func bar() -> String {
return "AnClass.bar()"
}
}
protocl 是比较特殊的,在 Swift 中 class, struct 和 enum 都是可以实现某个 protocol 的,这时候我们就会不知道在什么情况下使用 static,什么情况下使用 class。在 Swift2.0 之后,只要记住在任何时候使用 static 都是没有问题的。
Swift开发第十二篇——protocol组合&static和class的更多相关文章
- PowerBI开发 第十二篇:钻取
钻取是指沿着层次结构(维度的层次)查看数据,钻取可以变换分析数据的粒度.钻取分为下钻(Drill-down)和上钻(Drill-up),上钻是沿着数据的维度结构向上聚合数据,在更大的粒度上查看数据的统 ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探
SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...
- 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)
解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...
- 第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...
- 第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
- Python之路【第十二篇】:JavaScrpt -暂无内容-待更新
Python之路[第十二篇]:JavaScrpt -暂无内容-待更新
- 【译】第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
- 【译】第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...
随机推荐
- 原生js实现简洁的返回顶部组件
本文内容相当简单,所以没有发布到博客园首页,如果你不幸看到,那只能是我这篇文章的荣幸,谢谢你的大驾光临~(本博客返回顶部的功能就使用的是这个组件) 返回顶部组件是一种极其常见的网页功能,需求简单:页面 ...
- Sublime Text2配置过程
今天Sublime Text2不知道为什么突然崩溃了,一直不能运行,没办法只有重装了,重装后按我的用途重新配置了一下,现将配置过程记录下来以备将来不时之需 说明:配置是在windows系统上进行的,其 ...
- 【转】XPath的学习
xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker 定位 1.依靠自己属性,文本定位 //td[ ...
- SyteLine实现字段过滤
如果说某个下拉列表,想过滤某些选项,该怎样来做呢,在Infor Syteline实现起来是一件很容易的事情.如在Fixed Assets窗口中的Class Code的下拉列表中,如果不想"_ ...
- 开始MS SQL Server 2016之旅
下班前一刻,把MS SQL Server 2016安装好,国庆回来之后,就可以学习之旅......
- 常用Eclipse快捷方式
Ctrl+1 快速修复 Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特 ...
- Redis系列三之持久化
一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...
- JSP读取My SQL数据乱码问题的解决
用jsp读取My SQL数据库里面的数据,结果读出来的是乱码,把jsp页面的charset.pageEncoding属性都改成了UTF-8,My SQL数据库的Collate属性也改成了UTF-8,还 ...
- 算法:求幂(python版)
分别用迭代方法和递归方法实现求幂迭代方法的时间复杂度为O(n),空间复杂度为O(1)递归方法1的时间复杂度为O(logn),空间复杂度为O(logn)递归方法2的时间复杂度为O(n),空间复杂度为O( ...
- HDU 4283---You Are the One(区间DP)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4283 Problem Description The TV shows such as Y ...