美文网首页
每天学一点Swift----泛型(一)

每天学一点Swift----泛型(一)

作者: 冯可乐同学 | 来源:发表于2017-06-15 22:11 被阅读24次

一.泛型的作用

1.泛型是一种非常灵活的语法,泛型允许程序在函数、枚举、结构体、类中定义类型形参,这种类型形参实际代表的类型是动态改变的----程序可以等到真正使用这些函数、枚举、结构体时才为这些类型形参传入实际的类型。而且每次使用这些函数、枚举、结构体、类时都可以为泛型的类型形参传入不同的类型。

2.实例上,Swift的泛型无处不在,许多Swift的标准库都是通过泛型来实现的,比如已经学习过的数组和字典。

3.如果为了实现某个功能而定义了一个函数,在后期的需求变化中,仍然需要这个函数的功能,但是传入参数的时候参数的类型发生了变化,其他的都没有变。这个时候如果重新再写一个函数,那也只是参数类型不同而已,函数的执行体和之前的函数是完全相同的。如果下次传入的参数变成第三种类型了呢?----解决这个问题的关键就是泛型。

二.泛型函数

1.泛型函数允许在定义函数指定一个或多个类型占位符,这个类型占位符用于指定函数的一个或多个形参类型或者返回值类型暂时是不确定的,只有等到调用函数时才能确定这些形参类型或返回值类型。

2.定义泛型函数的语法:

func函数名(形参列表) ->返回值类型

{

//函数体

}

不难发现,泛型函数的函数签名多了类型占位符(也叫类型形参)声明,类型占位符声明以尖括号括起来,多个占位符之间以逗号分隔,所有的类型占位符声明放在函数名誉形参列表之间。

3.举个栗子:

func copyArray (src : [T], inout dest : [T])

{

//遍历src数组,并将src数组的元素追加到dest数组后面

for element in src

{

dest.append(element)

}

}

var arr1 = [29, 2, 3]

copyArray([11, 12, 13], &arr1)

var arr2 = ["abc", "def"]

sopyArray(["android", "Swift", "Objective-C"], &arr2)

var arr3 = [1.1, 2.2, 3.3]

copyArray([4.4, 5, 10.1), &arr3)

4.使用泛型定义多个类型的用法和上面例子中定义一个类型参数的用法相同。

三.泛型类型

1.泛型不仅可以用在函数中,也可以在Swift的类型(枚举、结构体、类)中使用,使用了泛型的类型就被称为泛型类型。

2. Swift内置支持的Array、Dictionary就是泛型,结构体。

3.可以为任何类型(包括枚举、结构体、类)增加泛型声明,举个例子:

struct FkRect

{

var x : T

var y : T

var width : T

var height : T

var position : (T, T)

{

return (self.x, self.y)

}

}

let rect1 = FkRect(x : 1.1, y : 2.2, wdith : 3.3, height : 4.4)

let rect2 = FkRect(x : 1, y : 2, width : 3, height : 4)

4.当创建了带泛型声明的父类之后,可以从该父类派生子类。需要指出的是,使用这些父类时不能再包含类型形参。

例如:class Apple

class ABC : Apple---这样是错误的,Apple类不能跟类型形参

5.定义函数、枚举、结构体、类时可以声明类型形参,使用函数、枚举、结构体、类时则需要为类型形参传入实例的类型。

6. Swift还要求泛型类的子类必须也带泛型声明,因此如果想从Apple类派生一个子类,则可以这样写:

public class ABC : Apple{}

需要说明的是,E与String并没有任何关系。

7.扩展泛型类型:扩展泛型类型时,程序并不需要再扩展列表中列出类型形参,扩展体可以直接使用泛型类型多定义的类型形参。举个例子:

class Apple

{

var info : T

init(info : T)

{

self.info = info

}

}

extension Apple

{

func bigThan(other : Apple, fn:(T, T) -> Int) -> Bool{

//....

}

}

var a1 = Apple(info : "apple1")

var a2 = Apple(info : "apple2")

var result = a1.bigThan(a2){

countElements($0) > countElements($1) ? 1 : 0

}

从上面可看出,扩展Apple时无须列出形参列表,但程序在扩展中完全可以使用类型形参T。

相关文章

  • 每天学一点Swift----泛型(一)

    一.泛型的作用 1.泛型是一种非常灵活的语法,泛型允许程序在函数、枚举、结构体、类中定义类型形参,这种类型形参实际...

  • 每天学一点Swift----泛型(二)

    四.类型约束 1.虽然程序可以对泛型形参传入任何类型,但有时候为泛型形参增加某种特定的约束也是必要的。就像字典,D...

  • 每天学一点Swift----函数(一)

    1. Swift中支持嵌套函数。 2.与函数紧密相关的另一个概念是闭包,闭包的本质是匿名函数,闭包可以作为表达式,...

  • 每天学一点Swift----集合(一)

    1. Swift的集合是一种特别有用的工具。Swift提供了数组和字典两种集合类型来存储集合数据。数组用于按顺序存...

  • 每天学一点Swift----可选类型

    一.可选和nil 1.在任何类型的后面紧跟?即可表示它是可选类型。可选类型的变量可以用来处理“值缺失”的情况。 2...

  • 每天学一点Swift----集合(二)

    三.字典:字典中以key-value的形式保存数据,所以同一个字典中key不能重复。 1.声明字典--两种方式 (...

  • 每天学一点Swift----函数(二)

    三.函数类型 1. Swift的每个函数都有类型的,函数类型由函数的形参列表,返回值类型组成。 2.使用函数类型定...

  • 每天学一点Swift----闭包(一)

    五.嵌套函数 1. Swift还支持在函数体内定义函数,这种在函数体内定义的函数称为嵌套函数 2.默认情况下,嵌套...

  • 每天学一点 Kotlin -- 多彩的类:泛型

    1. 泛型 1.1 Kotlin 中也有泛型的概念,和 Java 中的类似,但又不尽相同。先来看两种场景(1) 第...

  • 每天学一点Swift----闭包(三)

    八.捕获上下文中的变量和常量 1.闭包可以用访问或修改闭包所在上下文中的变量或常量(对于常量只是访问),这个过程被...

网友评论

      本文标题:每天学一点Swift----泛型(一)

      本文链接:https://www.haomeiwen.com/subject/geouqxtx.html