时间:2021-05-02
一、以泛型为参数的函数
泛型是Swift语言强大的核心,泛型是对类型的抽象,使用泛型开发者可以更加灵活方便的表达代码意图。我们知道,有参函数的参数必须有一个明确的参数类型,有些时候开发者会遇到这样一种情况,编写一个函数用于交换两个变量的值,由于变量有类型之分,实现相同的功能,可能需要重载成多个函数来实现,这大大浪费了开发成本,使用泛型,可以完美的解决这个问题,示例代码如下:
? 1 2 3 4 5 6 7 8 func exchange<T>(inout param1:T,inout param2:T){ let tmp = param1 param1 = param2 param2 = tmp } var p1 = "15" var p2 = "40" exchange(&p1, param2: &p2)上面的方法可以实现对任意相同类型变量的交换,函数参数中使用泛型,需要在函数名后的<>中定义参数占位符,如有多个参数占位符,用逗号隔开即可。
二、泛型在类型中的应用
泛型除了可以作为函数的参数、返回值外,在定义类型时,灵活应用泛型也可以解决很多十分棘手的问题,例如实现一个栈结构的集合类型,示例代码如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 struct Stack<ItemType> { var items:[ItemType] = [] mutating func push(param:ItemType) { self.items.append(param) } mutating func pop()->ItemType{ return self.items.removeLast() } } //整型栈 var obj1 = Stack<Int>() obj1.push(1) obj1.pop() //字符串栈 var obj2 = Stack<String>() obj2.push("HS") obj2.pop()在对使用了泛型的类型进行扩展时,不需要在使用<>进行泛型的定义,直接使用原定义的泛型占位符即可,示例如下:
? 1 2 3 4 5 extension Stack{ func getArray() -> [ItemType] { return items } }有时候,开发者需要对泛型进行一些约束,例如只允许此泛型是继承自某个类或者实现了某个协议,示例代码如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 class MyClass { } //只有MyClass的子类可以进行Stack栈的创建 struct Stack<ItemType:MyClass> { var items:[ItemType] = [] mutating func push(param:ItemType) { self.items.append(param) } mutating func pop()->ItemType{ return self.items.removeLast() } }在协议中,可以使用另一种方式来进行泛型编程,使用associatedtype关键字可以进行类型关联,示例如下:
? 1 2 3 4 5 6 7 8 9 protocol MyProtocol { //实现协议时才指定类型 associatedtype ItemType var param:ItemType {get set} } class MyClass:MyProtocol { //由于Swift可以自动识别类型 这是MyProtocol中的ItemType为Int var param: Int = 0 }三、泛型与where子句的结合使用
使用where子句可以对泛型进行更加严格约束,使其符合开发者需要的逻辑,示例如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 //T和C都要遵守整型协议 class MyClassTwo<T,C where T:IntegerType,C:IntegerType> { var param1:T var param2:C init(param1:T,param2:C){ self.param1=param1 self.param2=param2 } } var obj3 = MyClassTwo(param1: 1, param2: 1)声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
闲来无事,自己研究了泛型类的简单的使用,where表示泛型约束,表示泛型类型中的参数只能是car类型,IEnumerable是一个接口,一个集合要支持FOREA
一、泛型的基本概念java与c#一样,都存在泛型的概念,及类型的参数化。java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别
Apple期望在Swift中指针能够尽量减少登场几率,因此在Swift中指针被映射为了一个泛型类型,并且还比较抽象。这在一定程度上造成了在Swift中指针使用的
一、泛型概述1、背景在Java中增加泛型之前,泛型程序设计使用继承来实现的。坏处:需要进行强制类型转换可向集合中添加任意类型的对象,存在风险2、泛型的使用Lis
本文主要介绍在泛型定义中的<>中的占位符如何配合extends关键字使用,形如。泛型定义存在于这三种形式中:泛型类、泛型接口、泛型方法。一般的泛型定义中的,相当