持续创造,加速生长!这是我参加「日新计划 6 月更文应战」的第24天,点击查看活动概况。

在本章中,你将学会Generics泛型的运用办法。

前语

Apple官网或者网上共享的教程类文章不同,我将以实际开发角度讲述Swift言语的一些概念和用法,便利大家更好地学习和掌握Swift言语。

这一起也是对自己学习Swift言语进程的常识收拾。

如有过错,以你为准。

项目创立

咱们新建一个PlayGround项目,命名为SwiftGenerics

Swift实用小册21: Generics泛型的使用

泛型界说

泛型,是一种不确认的数据类型。

泛型答应咱们在编写代码时运用一些以后才指定的类型,并能在实例化时作为参数指明这些类型。

简单来说,泛型便是一个“占位符”,用来替代当前不确认的类型。

泛型函数

泛型函数运用到了一个“_”占位类型来替代参数值,然后提高代码复用率,削减代码量。示例:

funcgotoAppStore(appId: String) {
let urlPrex = "itms-apps"
let appUrl = urlPrex + "://itunes.apple.com/app/id" + appId
let appNsUrl = NSURL(string: appUrl)
UIApplication.shared.open(appNsUrl! as URL, options: [:], completionHandler: nil)
}
gotoAppStore(appId: "App的ID")

上述代码是咱们学习过的经过传入一个String类型的appId参数,然后跳转到AppStore的办法。

调用的时分,咱们会指定传入的参数,这儿运用的参数是appId

但假如咱们运用泛型函数,就能够不指定参数,泛型能够将类型参数化。示例:

funcgotoAppStore(_ appId: String) {
let urlPrex = "itms-apps"
let appUrl = urlPrex + "://itunes.apple.com/app/id" + appId
let appNsUrl = NSURL(string: appUrl)
UIApplication.shared.open(appNsUrl! as URL, options: [:], completionHandler: nil)
}
gotoAppStore("App的ID")

运用泛型函数,咱们就不需求指定参数,直接调用办法,到达削减代码量的作用,这也算是Apple官方极度寻求代码高雅的结果。

Swift标准库是经过泛型代码构建出来的,像咱们之前学习过的数组、字典其实也都是泛型调集。

Swift实用小册21: Generics泛型的使用

泛型类型

除了能够运用泛型函数削减代码量外,咱们还能够自界说泛型类型,假如咱们提前不知道需求接受到的数据类型,咱们就能够先界说好一个泛型类型,然后确认类型后直接调用办法。示例:

struct Example<ArrayElement> {
var items = [ArrayElement]()
mutating func push(_ item: ArrayElement) {
items.append(item)
}
}

上述代码中,咱们界说了一个自界说类型的结构体Example,在Example结构体中,咱们声明晰一个items数组,它也是自界说类型的。

然后写了一个办法,经过泛型函数的办法传入参数,将传入的参数添加到自界说类型items数组中。

咱们能够发现,咱们在声明数组时是没有指定这个数组是什么类型的,Example结构体传入也是,它便是泛型类型

这样在咱们在后面确认好传入的参数类型后,咱们就不需求重新修改数组的类型。示例:

var exampleStrings = Example<String>()
exampleStrings.push("文如秋雨")

上述代码中,咱们声明晰一个exampleStrings变量,它给Example结构体界说了String类型,后面咱们就能够直接调用push传入相应类型的参数即可。

关联类型

在咱们界说协议时,咱们对于协议中的特点也能够运用到泛型的办法,这儿提及一个关联特点的概念,也便是咱们在协议中能够先不界说特点的类型,而在运用的时分再确认特点的类型。示例:

protocol Person {
associatedtype FullName
mutating func push(_ item: FullName)
}

上述代码中,咱们界说了一个Person协议,然后运用associatedtype关键字声明晰一个还不确认类型的参数FullName

然后依旧写了一个接纳泛型函数的办法push,咱们再界说一个class来遵从这个协议。示例:

class People: Person {
typealias FullName = String
func push(_ item: String) {
print("输入的FullName是String")
}
}
var exampleStrings2 = People()
exampleStrings2.push("文如秋雨")

上述代码中,咱们界说了一个类People,遵从Person协议,然后调用typealias关键字,给FullName参数设置了一个关联类型String

然后在办法中传入参数,打印输出文字。

咱们能够经过上面的办法知道,运用关联类型时,咱们就不需求在提前设置参数的类型,在咱们实际业务中运用到了咱们再界说,也就不必老是修改代码,然后提高代码复用率,削减代码量

Swift实用小册21: Generics泛型的使用

以上便是本章的全部内容。

快来动手试试吧!

假如本专栏对你有帮助,无妨点赞、谈论、关注~