swift2.2泛型详解

本文深入讲解Swift中的泛型概念,包括泛型函数、类型参数、泛型类型等,并通过具体示例介绍了如何使用泛型提高代码灵活性及复用性。

Swift2.2范型详解

泛型所解决的问题
泛型函数
类型参数
命名类型参数
泛型类型
扩展一个泛型类型
类型约束
关联类型
Where 子句

1.范型所解决的问题

func swapTwoInts(inout a: Int, inout _ b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
func swapTwoStrings(inout a: String, inout _ b: String) {
    let temporaryA = a
    a = b
    b = temporaryA
}

上面的swapTwoIntsswapTwoStrings的函数功能是相同的,只是传入函数的参数不同
通常我们需要的是更加灵活的方式来交换两个参数Swift提供了范型范型可以解决这个问题

2.范型函数

func swapTwoValues<T>(inout a: T, inout _ b: T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

通过<T>定义一个占位类型,<>表示告诉Swift这里的类型不要去推断T的实际数据类型; 同时后面的传入参数也制定类型为T ,表示传入的参数类型一致,

3.类型参数

在上面的 swapTwoValues(_:_:) 例子中,占位类型 T 是类型参数的一个例子。类型参数指定并命名一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来(例如 <T>)。

一旦一个类型参数被指定,你可以用它来定义一个函数的参数类型(例如 swapTwoValues(_:_:)函数中的参数 ab),或者作为函数的返回类型,还可以用作函数主体中的注释类型。在这些情况下,类型参数会在函数调用时被实际类型所替换。(在上面的 swapTwoValues(_:_:) 例子中,当函数第一次被调用时,TInt 替换,第二次调用时,被 String 替换。)

4.命名类型参数

在大多数情况下,类型参数具有一个描述性名字,例如 Dictionary<Key, Value> 中的 KeyValue,以及 Array<Element> 中的 Element,这可以告诉阅读代码的人这些类型参数和泛型函数之间的关系。然而,当它们之间没有有意义的关系时,通常使用单个字母来命名,例如 TUV,正如上面演示的 swapTwoValues(_:_:) 函数中的 T 一样。

5.泛型类型

除了泛型函数,Swift 还允许你定义泛型类型。这些自定义类、结构体和枚举可以适用于任何类型,类似于 Array 和 Dictionary。
下面定义的是一个泛型类型的结构体

struct Stack<Element> {
    var items = [Element]()
    mutating func push(item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

//代码中的mutating :Swift中protocol的功能比OC中强大很多,不仅能再class中实现,同时也适用于struct、enum。使用 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,在设计接口的时候,也要考虑到使用者程序的扩展性。所以要多考虑使用mutating来修饰方法。

创建Stack实例 并且加入数据

var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")

![](/Users/zhangyong/Desktop/stackPushedFourStrings_2x.png
)
通过Name<>这样的方式对泛型类型的定义一个占位的数据类型,来实现对多种数据的类型的处理,从而达到泛型类型的根本,同一个类型处理多种数据类型.

6.扩展一个泛型类型

当你扩展一个泛型类型的时候,你并不需要在扩展的定义中提供类型参数列表。原始类型定义中声明的类型参数列表在扩展中可以直接使用,并且这些来自原始类型中的参数名称会被用作原始定义中类型参数的引用。

extension Stack {
    var topItem: Element? {
        return items.isEmpty ? nil : items[items.count - 1]
    }
}

if let topItem = stackOfStrings.topItem {
    print("The top item on the stack is \(topItem).")
}

7.类型约束

swapTwoValues(_:_:) 函数和 Stack 类型可以作用于任何类型。不过,有的时候如果能将使用在泛型函数和泛型类型中的类型添加一个特定的类型约束,将会是非常有用的。类型约束可以指定一个类型参数必须继承自指定类,或者符合一个特定的协议或协议组合。

例如,Swift 的 Dictionary 类型对字典的键的类型做了些限制。在字典的描述中,字典的键的类型必须是可哈希(hashable)的。也就是说,必须有一种方法能够唯一地表示它。Dictionary 的键之所以要是可哈希的,是为了便于检查字典是否已经包含某个特定键的值。若没有这个要求,Dictionary 将无法判断是否可以插入或者替换某个指定键的值,也不能查找到已经存储在字典中的指定键的值。

为了实现这个要求,一个类型约束被强制加到 Dictionary 的键类型上,要求其键类型必须符合 Hashable 协议,这是 Swift 标准库中定义的一个特定协议。所有的 Swift 基本类型(例如 String、Int、Double 和 Bool)默认都是可哈希的。

8.类型约束实践

func findIndex<T: Equatable>(array: [T], _ valueToFind: T) -> Int? {
    for (index, value) in array.enumerate() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

Equatable是Swift标准库中支持==比较的协议,通过这个协议就可以保证泛型参数最后是可以进行==操作的,这样也就对泛型添加了类型约束,使此泛型具有了更加强大的功能

内容概要:本文详细介绍了“电动汽车聚合可行域的内-外结合近似方法”的Matlab代码实现,旨在通过数值仿真手段对大规模电动汽车集群作为灵活资源参与电网调度的能力边界进行建模与逼近。该方法融合内部凸包构造与外部约束逼近策略,精确刻画电动汽车在充电状态、功率调节、时间维度等方面的聚合可调能力范围,形成紧致的可行域表示,为高比例电动车接入下的电力系统优化调度、需求响应、车网互动(V2G)等关键应用提供可靠的建模基础。文中强调科研应兼顾严谨逻辑与创新思维,并倡导借助YALMIP等成熟优化工具提升研究效率。完整的代码、工具包及相关案例可通过指定网盘链接和微信公众号“荔枝科研社”获取。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的科研人员,尤其适用于从事新能源并网、电动汽车调度、智能电网、综合能源系统等方向的研究生与工程技术人员。; 使用场景及目标:①研究大规模电动汽车集群的聚合建模与灵活性量化方法;②实现电动汽车聚合可行域的内-外近似算法;③支撑含高渗透率电动汽车的电力系统日前-实时协同优化调度;④学习并应用YALMIP工具进行数学规划建模与求解;⑤为需求响应、市场机制设计及V2G运营提供技术支撑。; 阅读建议:建议读者按照文档指引循序渐进学习,结合网盘提供的完整资源(包括YALMIP工具包与示例代码)进行实践调试,重点掌握内-外近似方法的数学建模逻辑、约束处理技巧及优化求解流程,并参考团队发布的其他相关案例,深化对优化算法与仿真技术在能源系统中应用的理解。
下载代码方式:https://pan.quark.cn/s/93e47adaae45 医学研究人员近期识别了若干新病毒,经由对这些病毒的解析,揭示出它们的遗传物质序列均呈现环状形态。当前,研究人员已汇集了丰沛的病毒遗传物质与人类遗传物质样本数据,期望能迅速辨识个体是否感染了相关病毒。为便于探究,研究人员将人类遗传物质与病毒遗传物质均表述为由若干字母构成的字符串序列。继而,检测某种病毒遗传物质序列是否在患者遗传物质序列中有所显现,倘若出现,则表明该个体感染了对应病毒,反之则未感染。《病毒感染检测实验报告》是在医学研究背景下,依托软件技术基础中的编程知识完成的一个课程设计任务,其目的在于评估人体是否感染特定病毒。在此实验中,病毒遗传物质与人类遗传物质被表现为字母序列,通过比对病毒遗传物质序列是否存在于人的遗传物质序列中,从而判定感染状态。在程序构建方面,该实验所涉及的核心知识要点包括: 1. **字符串操作**:程序需处理病毒遗传物质与人类遗传物质的序列,这些序列以字符串形式呈现。字符串操作涵盖输入、输出、比较及匹配等操作,是C/C++编程的基础。 2. **线性表**:遗传物质序列可视为线性数据结构,可通过数组来表示。程序运用全局变量数组`V`和`D`存储病毒与人的遗传物质序列。 3. **栈**:在循环展开病毒遗传物质时,可能需借助栈数据结构来保存某个阶段遗传物质序列的状态,以便进行所有可能的匹配尝试。 4. **BF算法**(Brute Force,暴力搜索算法):BF算法是一种基础性的字符串匹配方法,用于在文本中搜寻模式。在此,BF算法用于在人的遗传物质序列中探寻病毒遗传物质序列的所有展开形态。 5. **文件处理**:程序需从文件《病毒感染检测输入数据...
内容概要:本文系统研究了基于粒子群PSO、灰狼GWO、鲸鱼WOA、哈里斯鹰HHO、蜣螂DBO、麻雀SSA六种智能优化算法的无人机三维路径规划方法,并通过Matlab代码实现了在复杂三维环境下的路径搜索与优化对比。研究构建了包含障碍物、威胁区域等实际地形特征的空间模,综合考虑路径长度、飞行时间、能耗及安全性等多维度成本函数,对各算法的寻优能力、收敛速度、稳定性和全局搜索性能进行了量化评估与深入分析。通过大量仿真实验,全面比较了不同算法在多样化环境条件下的路径规划表现差异,揭示了各类算法的优势与局限性,为无人机在实际任务中的自主导航与决策提供了可靠的算法选依据和技术支撑。; 适合人群:具备一定Matlab编程基础,从事无人机路径规划、智能优化算法研究或相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握主流群智能优化算法在三维路径规划中的建模与实现方法;② 对比分析不同算法在复杂环境下的性能优劣,服务于算法选与改进;③ 为无人机自主导航、无人系统协同控制等应用场景提供算法验证平台。; 阅读建议:此资源以Matlab代码为核心,建议读者结合代码与算法原理进行同步学习,通过调整环境参数与成本函数权重开展仿真实验,深入理解算法行为特征,并可根据自身研究需求进行二次开发与拓展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值