swift基础- 泛型(一)

来源:互联网 发布:咪咕刷枪软件 编辑:程序博客网 时间:2024/06/09 16:24

此文为转载,请尊重产权


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

今天博客中的内容算是比较简单,也是比较基础,虽简单,但失其重要性。今天博客中就通过一些示例来窥探一下泛型的使用方法和使用场景。无论你是在函数,类,协议,延展等场景中使用泛型。他们有一个共性,同时也是泛型的特点“高度重用性”。能写出高度重用的东西,在编程中是灰常令人兴奋的一件事情。

一. 泛型函数

1.单一占位符泛型函数

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

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

    

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

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

 

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

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

 

二.泛型类

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

 

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

上面是泛型类的定义与使用,泛型还可以应用于结构体,协议,延展等,其使用方法和泛型类是差不多的,要学会举一反三。在本篇博客中就不对泛型结构体,泛型协议,泛型延展,以及泛型的约束做过多的赘述了。



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




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

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

import UIKit


var str = "Hello, playground"

//泛型函数

//单一

func swap<myCustomType>( inout number1:myCustomType, inout number2 : myCustomType){

    let temp =  number1

    number1 = number2

    number2 = temp

    

}

var tempString1 = "jobs"

var tempString2 = "steve"

swap(&tempString1,&tempString2)

tempString2

tempString1


//多个泛型占位符

func connect<firstType,secondType>(number1 :firstType   ,number2:secondType)->String{

    let temp =  "\(number1)" +"\(number2)"

    return temp

    

}


let result1 = connect(10, number2: 10.00)

var result2 = connect("abcde", number2: 10.0000)



//泛型类的定义(即在声明类中使用泛型)

class myTestClass <myCustomType>{

    var values = [myCustomType]()

    func display(){

        for( var i = 0;i <self.values.count; i++){

            print (values[i])

        }

    }

    

}

//泛型类的使用

var myClass:myTestClass<String> =myTestClass<String>()

myClass.values = ["aaa","bbb","cccc"]

myClass.display()


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

0 0
原创粉丝点击