【学习】重学Swift5-泛型
七、泛型
func swapTwoInts(_ a:inout Int, _ b:inout Int) {
let temp = a
a = b
b = temp
}
func swaoTwoValues<T>(_ a:inout T, _ b:inout T) {
let temp = a
a = b
b = temp
}
var a = 13, b = 12
swapTwoInts(&a, &b)
print(a, b)
var aStr = "12", bStr = "333"
//swapTwoInts(&aStr, &bStr)
swaoTwoValues(&a, &b)
print(a, b)
swaoTwoValues(&aStr, &bStr)
print(aStr, bStr)
// 上面的中,swapTwoInts只能交换Int类型的值,而后面声明的泛型swaoTwoValues可以交换不同类型的值,更简洁
struct Stack<Element> {
var items = [Element]()
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
}
// 初始化的时候类型不能省略Stack<String>()
var stackOfStrings = Stack<String>()
stackOfStrings.push("ddd")
stackOfStrings.push("jdieji")
stackOfStrings.push("d")
stackOfStrings.pop()
// 上面的中,声明了一个泛型栈
//当你扩展一个泛型类型时,不需要在扩展的定义中提供类型形式参数列表。原始类型定义的类型形式参数列表在扩展体里仍然有效,并且原始类型形式参数列表名称也用于扩展类型形式参数。
extension Stack {
var topItem: Element? {
return items.isEmpty ? nil : items[items.count - 1]
}
}
// 类型约束
/*
func somFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// func body
}
*/
func findIndex<T: Equatable>(of valueToFind: T, in array:[T]) -> Int? {
for (index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}
// 关联类型(协议使用泛型)
protocol Container {
associatedtype ItemType
mutating func append(_ item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
struct IntStack: Container {
var items = [Int]()
// 通过强大的类型推断,类型可以省略
typealias ItemType = Int
mutating func append(_ item: Int) {
items.append(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Int {
return items[i]
}
}
// 泛型+where
func allItemsMAtch<C1: Container, C2: Container>(_ someContainer: C1, _ anotherContainer: C2) -> Bool where C1.ItemType == C2.ItemType, C1.ItemType: Equatable {
if someContainer.count != anotherContainer.count {
return false
}
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i]
return false
}
return true
}
//extension Stack wherr Element : Equatable {
// // code
//}
extension Container where ItemType: Equatable {
// code
}
extension Container where ItemType == Double {
// code
}
// 泛型下标
extension Container {
subscript<Indices: Sequence>(indics: Indices) -> [ItemType] where Indices.Iterator.Element == Int {
var result = [ItemType]()
for index in indics {
result.append(self[index])
}
return result
}
}
struct IntStack: Container {
var items = [Int]()
// 通过强大的类型推断,类型可以省略
typealias ItemType = Int
mutating func append(_ item: Int) {
items.append(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Int {
return items[i]
}
}
var intStack = IntStack()
intStack.append(1)
intStack.append(2)
print(intStack[[0, 1]])
【学习】重学Swift5-泛型的更多相关文章
- 重学Java泛型
一丶从字节码层面看范型擦除 public class Type1<T> { private T t; } 使用jclasslib插件查看其字节码: 可以看到 t属性的类型是List< ...
- 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...
- 重学hadoop技术
最近因为做了些和hadoop相关的项目(虽然主要是运维),但是这段经历让我对hadoop的实际运用有了更加深入的理解. 相比以前自学hadoop,因为没有实战场景以及良好的大数据学习氛围,现在回顾下的 ...
- 重学C++ (1)
写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...
- 推翻自己和过往,重学自定义View
http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...
- 重学js之JavaScript 面向对象的程序设计(创建对象)
注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...
- 打算写一个《重学Node.js》系列,希望大家多多支持
先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 重学 Java 设计模式:实战单例模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...
- 重学 Java 设计模式:实战适配器模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 擦屁屁纸80%的面积都是保护手的! 工作到3年左右很大一部分程序员都想提升自己的技术 ...
随机推荐
- go-zero使用
官网文档地址: https://go-zero.dev/docs/tasks 这是一个脚手架,用于把proto文件或者api文件转为服务代码. 环境安装分4步(官网文档上有写): 1.安装golang ...
- C#脚本化(Roslyn):如何在运行时引入nuget包
假设我们开发了一个C#脚本编辑器,利用Roslyn去执行用户所编写的脚本.这时候,如果用户想要引用一个nuget包,应该如何实现呢? 我们想要引用nuget包的话,只要能得到nuget包及其依赖包的所 ...
- C# DataGridView 控制只能选择一行
https://www.it1352.com/1112692.html multiselectchanged方法的值false 将DataGridView的 SelectionMode 更改为当用户点 ...
- C# 有错误日志返回的POST 请求 WebException
/// <summary> /// POST请求 /// </summary> /// <param name="ur ...
- Spark知识点汇总
一.Spark架构设计 二.Spark常用算子 tips1: 数据处理的生命周期tips2: repartition vs coalesce区别: 可以使用 repartition 算子随意调整(提升 ...
- 比特位计数 leetcode 338
简介 问题的答案就在问题之中 问题说不允许使用 如 C++ 中的 __builtin_popcount 那么我们知道了可以用的为什么不去试试呢? 参考连接 https://leetcode-cn.co ...
- 回答准确率从60%飙至95%!AI知识库救命方案
AI 的浪潮席卷而来,各行各业都在积极探索 AI 的落地应用,无论是为了提升工作效率,还是为了在同事和领导面前展现技术实力,技术先行者们都跃跃欲试.在众多 AI 落地场景中,**知识库(Retriev ...
- 通过AppLink把拼多多热门榜单商品同步至小红书
上篇说到AppLink当中定时调度方式如何配置,这次来演示一下,如何把热门榜单信息同步至小红书 1.拉取一个定时器作为触发动作,通过配置定时器调度时间将定时策略配置为每天执行一次 2.触发动作完成后通 ...
- 运用ETLCloud快速实现数据清洗、转换
一.数据清洗和转换的重要性及传统方式的痛点 1.数据清洗的重要性 数据清洗.转换作为数据ETL流程中的转换步骤,是指在数据收集.处理.存储和使用的整个过程中,对数据进行检查.处理和修复的过程,是数据分 ...
- 连接语言大模型(LLM)服务进行对话
1. 引言 最近开始接触AI大模型方向的工作,第一个实例就尝试一下连接大模型进行对话的实现. 2. 实现 2.1 openai模块 要实现这个功能很简单,直接翻各大模型平台的给的API案例一般都可以实 ...