Swift泛型协议的N种用法
They said "you should learn a new language every year," so I learned Swift. Now I learn a new language every two weeks!
这个笑话绝对是我看过的Swift被黑的最惨的一次!所以今天我们来学习一下Swift的泛型。
Swift的泛型有点奇怪,针对Class和Function,都是通过<Type>来定义,和C#一摸一样,同样也有where关键字进行约束。
func swapTwoValues<T>(inout a: T, inout _ b: T) {
let temporaryA = a
a = b
b = temporaryA
}
class CanPrintBase<T> {
func PrintType(output: T) -> Void {}
}
但是面对Interface,也就是Swift里的Protocol,需要使用associatedtype关键字来定义泛型:
protocol CanPrint {
associatedtype E
func PrintType(output: E) -> Void
}
那要怎么去实现这个接口呢?通常是这样子的:
class TypePrinter0 : CanPrint{
typealias E = String
func PrintType(output: E) {
print(type(of:output))
}
}
let print0 = TypePrinter0()
print0.PrintType(output: "String Type")
然后就会在output窗口打印“String”。
阿西吧!这么奇怪的语法简直不能忍!就不能用<Type>来写吗?
曲线救国的话,我们可以考虑模拟一个抽象类class CanPrintBase<T>,通过继承来实现同样的效果:
class TypePrinter3: CanPrintBase<String>{
override func PrintType(output: String){
print(type(of:output))
}
}
let print3 = TypePrinter3()
print3.PrintType(output: "String Type")
那么我们像C#一样直接在类定义的时候通过占位符的方式可以嘛?
//This one cannot work!
class TypePrinter1<E: String> : CanPrint{
func PrintType(output: E) {
print(output)
}
}
错误提示为:Inheritance from non-protocol, non-class type 'String'。也就是说如果是class类型的话就可以:
public class SomeType {}
class TypePrinter2<E: SomeType> : CanPrint{
func PrintType(output: E) {
print(output)
}
}
let print2 = TypePrinter2()
print2.PrintType(output: SomeType())
反之我们也可以写成这样:
class TypePrinter5 : CanPrint{
typealias E = SomeType
func PrintType(output: E) {
print(output)
}
}
let print5 = TypePrinter5();
print(type(of: print5))
print(type(of: print2))
将类型打印出来的话,分别是TypePrinter5和TypePrinter2<SomeType>,也就是说这两种写法得到的类型是完全不一样的。
呵呵也是蛮妖的嘛,还可以把类型的具体定义留到使用时再声明:
class TypePrinter4<E> : CanPrint{
func PrintType(output: E) {
print(output)
}
}
let print4 = TypePrinter4<SomeType>()
print4.PrintType(output: SomeType())
let print6 = TypePrinter4<String>()
print6.PrintType(output: "I am a String")
这一点又和C#傻傻分不清楚了。
本篇实在是蛮无聊的纠缠与Swift泛型协议的语法,如孔乙己般尝试了回字的N种写法。至于为什么Swift要这么设计,我们下一篇可以尝试和C#对比看看。
GitHub:
https://github.com/manupstairs/LearnSwift/tree/master/GenericProtocolTest
Swift泛型协议的N种用法的更多相关文章
- swift闭包的另一种用法
这不是教程. 当你碰到函数参数需要传递一个闭包(closure)时,一般是可以直接这么传递的(假定无返回): // 教程一般教你在参数位置传递closure: someMethod(arg1, arg ...
- swift 当协议遇见了泛型
由于泛型比较简单,并没有单独拿出来介绍!我们在定义函数的时候,有时候只是由于参数或者返回值类型不同,而具体的实现过程是一模一样的,这个时候我们就可以定义泛型函数而使可以传入不同的参数类型: func ...
- iOS -Swift 3.0 -for(循环语句用法)
// // ViewController.swift // Swift-循环语句 // // Created by luorende on 16/12/08. // Copyright © 2016年 ...
- .NET(c#)new关键字的三种用法
前几天去家公司面试,有一道这样的题:写出c#中new关键字的三种用法,思前想后挖空心思也只想出了两种用法,回来查了下msdn,还真是有第三种用法:用于在泛型声明中约束可能用作类型参数的参数的类型,这是 ...
- (转载)OC学习篇之---协议的概念和用法
在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...
- NEW关键字的三种用法
最近面试中有一道题是写new关键字的几种用法,想了下写下我知道的两种用法 第一种 创建对象.调用构造函数,这就不用讲了 ClassA A=new ClassA(); 第二种 是作为修饰符,显示隐藏继 ...
- OC中协议的概念以及用法
OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...
- c# new关键字的三种用法
三种用法如下: 在 C# 中,new 关键字可用作运算符.修饰符或约束. 1)new 运算符:用于创建对象和调用构造函数. 2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成 ...
- Linux下dmesg命令处理故障和收集系统信息的7种用法
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
随机推荐
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- 开源库Magicodes.ECharts使用教程
目录 1 概要 2 2 Magicodes.ECharts工作原理 3 2.1 架构说明 3 2.1.1 Axis 4 2.1.2 CommonD ...
- dp跟px的互相转换
一 获取手机屏幕的密度 1 获取屏幕的宽和高,然后根据 直角三角形的 a边的平方+b边的平方=c边的平方 得到另一条边的长:然后除以 ,屏幕的尺寸,就是 手机的密度destity 2 根据上下文获取c ...
- AMD加载器实现笔记(二)
AMD加载器实现笔记(一)中,我们实现了一个简易的模块加载器.但到目前为止这个加载器还并不能称为AMD加载器,原因很简单,我们还不支持AMD规范中的config配置.这篇文章中我们来添加对config ...
- web前端工程师在移动互联网时代里的地位问题
支付宝十周年推出了一个新产品:支付宝的十年账单,我也赶个时髦查看了一下我的支付宝十年账单,哎,感慨自己真是太屌丝了,不过这只是说明我使用淘宝少了,当我大规模网上购物时候,我很讨厌慢速的快递,所以我大部 ...
- jQuery实现返回顶部
由于项目需要,写了个返回顶部的小功能... /*返回顶部*/ function toTop() { $(".to_top").hide(); $(window).scroll(fu ...
- [分享黑科技]纯js突破localstorage存储上线,远程抓取图片,并转码base64保存本地,最终实现整个网站所有静态资源离线到用户手机效果却不依赖浏览器的缓存机制,单页应用最新黑科技
好久没有写博客了,想到2年前答应要放出源代码的也没放出来,最近终于有空先把纯js实现无限空间大小的本地存储的功能开源了,项目地址https://github.com/xueduany/localsto ...
- 细说.NET中的多线程 (五 使用信号量进行同步)
上一节主要介绍了使用锁进行同步,本节主要介绍使用信号量进行同步 使用EventWaitHandle信号量进行同步 EventWaitHandle主要用于实现信号灯机制.信号灯主要用于通知等待的线程.主 ...
- ASP.NET Core: 全新的ASP.NET !
背景 最新版本的 ASP.NET 叫做 ASP.NET Core (也被称为 ASP.NET 5) 它颠覆了过去的 ASP.NET. 什么是 ASP.NET Core? ASP.NET Core ...
- Linux~centos上安装.netcore,HelloWorld归来!
对于跨平台的.netCore来说,让它的程序运行在Linux系统上已经成为必然,也是一种趋势,毕竟我们的很多服务都放在linux服务器上(redis,mongodb,myql,fastDFS,luce ...