本篇分为两部分:

一、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的更多相关文章

  1. PowerBI开发 第十二篇:钻取

    钻取是指沿着层次结构(维度的层次)查看数据,钻取可以变换分析数据的粒度.钻取分为下钻(Drill-down)和上钻(Drill-up),上钻是沿着数据的维度结构向上聚合数据,在更大的粒度上查看数据的统 ...

  2. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  3. 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

    SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...

  4. 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)

    解剖SQLSERVER 第十二篇   OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...

  5. 第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  6. 第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  7. Python之路【第十二篇】:JavaScrpt -暂无内容-待更新

    Python之路[第十二篇]:JavaScrpt -暂无内容-待更新

  8. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  9. 【译】第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

随机推荐

  1. C#如何调用COM

    这章中描述的属性被用在创建和COM程序交互的程序中. 1.1  COMImport 属性 当被放在一个类上, COMImport 属性就把这个类标记为一个外部实现的COM 类.这样的一个类声明使得可以 ...

  2. LINQ to SQL语句(1)之Where

    适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操作包括3种形式,分别为简单形式.关系条件形式. ...

  3. C语言学习001:让程序跑起来

    编译工具下载 MinGW - Minimalist GNU for Windows 编译运行 #include <stdio.h> int main(){ puts("C roc ...

  4. Spring @Transactional propagation 各个属性值的含义

    REQUIRED:业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. NOT_SUPPORTED:声明方法不需要事务.如果方法没有关联到一 ...

  5. 使用Json.NET来序列化所需的数据

    我们在做开发的时候,很多时候需要和Json数据格式打交道,如Web开发里面,很多时候,数据通过Json进行传递到页面上,然后在进行处理的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用 ...

  6. 微信、QQ、微博、陌陌……社交网络的底层逻辑是什么?

      两 年前的社交产品泛滥犹在眼前,场景之胜几乎到了言必谈社交的地步.时任阿里新CEO陆兆禧举全集团之力,力推新社交产品“来往”,动作之大震惊整个互联 网.如今,陆兆禧早早退场,只留下一个硬汉的孤独背 ...

  7. 一不小心把oschina给戒了

    不知怎么回事,逐渐变成一周看一次oschina了.

  8. JVM简介

    关于java的JVM这块儿知识,在项目做大之后,一些性能的优化,要涉及到数据库,一些缓存要放在内存中.还有一些JMS的消息传播等等,高大上的知识需要有JVM内存模型知识的支持.所以自问自答,来回答下面 ...

  9. Web-Nginx配置

    #运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; ...

  10. php中读写excel表格文件示例。

    测试环境:php5.6.24.这块没啥兼容问题. 需要更多栗子,请看PHPExcel的examples.还是蛮强大的. 读取excel文件. 第一步.下载开源的PHPExcel的类库文件,官方网站是h ...