Swift中也是支持泛型的,在许多现代编程语言,如C++, Java, C#也都是支持泛型的。泛型,从表面的名字来看,就是宽泛的数据类型。使用泛型定义的方法,类,结构体,协议等可以支持不同的数据类型。泛型其实就是数据类型的占位符。当然这个占位符的名字有你来定,你定义的这个占位符就是数据类型的变量,你传给他什么类型,那么这个泛型占位符就代表什么类型。这样说来泛型理解起来就不困难了。

高度重用性”。能写出高度重用的东西,在编程中是灰常令人兴奋的一件事情。

一. 泛型函数

1.单一占位符泛型函数

下面就使用一个经典案例:两个数值进行交换。来使用泛型,写一个通用的函数,这个函数的功能就是交换两个变量的值。在Swift中不允许类型隐式转换,也就是说,如果你定义的该函数是交换两个整数的,那么如果你想使用他来交换浮点类型的数据,那么对不起,是不允许这样做的。为了写个通用的函数,那接下来就是泛型出场的时候了。

MyCustomeType就是在函数中定义的泛型占位符,改占位符表示传入的参数是什么类型,那么MyCustomeType就是什么类型。这样一来,使用泛型定义的该函数就是通用的了。在该函数中只用到了一个MyCustomeType,也就是下方的函数还是有一定约束性,就是number1和number2的类型都是相同数据类型的,这种情况也是单一占位符泛型函数。


swift 属性支持泛型 swift中泛型_占位符

    

调用上述函数来交换两个字符串类型的值:


swift 属性支持泛型 swift中泛型_swift_02

同样的函数,你还可以使用它来交换两个整数,浮点数等等其他数据类型,下方就是交换的两个整型的数据,也是没有问题的。


swift 属性支持泛型 swift中泛型_泛型类_03

 

2.多个占位符的泛型函数

这个是在上述函数中进行的扩充,泛型占位符允许是一个列表的形式出现的,也就是允许有多个不同的泛型占位符来代表不同的数据类型。也许说起来有些拗口,接下来就来个实例在函数中使用多个泛型占位符。具体实例如下所示。本质上允许在泛型占位符中添加多个泛型类型变量。下方的函数两个参数的数据类型允许不同,因为其参数使用的是不同的泛型占位符,所以其类型允许是不同的。具体使用方式如下所示。


swift 属性支持泛型 swift中泛型_swift 属性支持泛型_04

 

二.泛型类

泛型类,顾名思义,就是在类中使用泛型。在类中使用泛型,其实和函数中使用泛型是一样的。就是在声明类的时候,使用泛型占位符表示一个要处理的泛型即可。下方就是一个泛型类,其中有个泛型类型数组,还有一个打印该数组的方法,如下所示:


swift 属性支持泛型 swift中泛型_swift_05

 

上面是泛型类的定义,紧接着就是泛型类的使用了,下方是创建一个泛型类的实例,然后调用相应的方法,具体如下所示。


swift 属性支持泛型 swift中泛型_占位符_06

泛型结构体,泛型协议,泛型延展,以及泛型的约束做过多的赘述了。

/: Playground - noun: a place where people can play

swift 支持泛型,很多现代的编程语言如c++,java,c#也是支持泛型的.

他们有一个共性,同时也是泛型的特点“高度重用性”。能写出高度重用的东西,在编程中是灰常令人兴奋的一件事情。

import
 
var str = "Hello, playground"
//泛型函数
单一
func swap<myCustomType>(  inout number1:myCustomType,  inout number2 : myCustomType){
let
     number1 = number2
     number2 = temp
     
 }
var tempString1 =  "jobs"
var tempString2 =  "steve"
(&tempString1,&tempString2)
 tempString2
 tempString1
 
//多个泛型占位符
func connect<firstType,secondType>(number1 :firstType   ,number2:secondType)->String{
let temp =  "\(number1)" + "\(number2)"
return
     
 }
 
let result1 = connect(10, number2: 10.00)
var result2 = connect("abcde", number2: 10.0000)
 
 
//泛型类的定义(即在声明类中使用泛型)
class
var
func
for( var i = 0;i < self.values.count; i++){
print (values[i])
         }
     }
     
 }

//泛型类的使用

var myClass:myTestClass<String> = myTestClass<String>()
myClass.values = ["aaa","bbb","cccc"]
.display()

//泛型还可以用于结构体,协议proctrol,延展extence,他们的使用方法和泛型类是类似的,要学会举一反三