持续创造,加速生长!这是我参加「日新计划 6 月更文应战」的第24天,点击查看活动概况。
在本章中,你将学会Generics
泛型的运用办法。
前语
和Apple
官网或者网上共享的教程类文章不同,我将以实际开发角度讲述Swift
言语的一些概念和用法,便利大家更好地学习和掌握Swift
言语。
这一起也是对自己学习Swift
言语进程的常识收拾。
如有过错,以你为准。
项目创立
咱们新建一个PlayGround
项目,命名为SwiftGenerics
。
泛型界说
泛型,是一种不确认的数据类型。
泛型答应咱们在编写代码时运用一些以后才指定的类型,并能在实例化时作为参数指明这些类型。
简单来说,泛型便是一个“占位符
”,用来替代当前不确认的类型。
泛型函数
泛型函数运用到了一个“_
”占位类型来替代参数值,然后提高代码复用率,削减代码量。示例:
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
标准库是经过泛型代码构建出来的,像咱们之前学习过的数组、字典其实也都是泛型调集。
泛型类型
除了能够运用泛型函数削减代码量外,咱们还能够自界说泛型类型,假如咱们提前不知道需求接受到的数据类型,咱们就能够先界说好一个泛型类型,然后确认类型后直接调用办法。示例:
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
。
然后在办法中传入参数,打印输出文字。
咱们能够经过上面的办法知道,运用关联类型时,咱们就不需求在提前设置参数的类型,在咱们实际业务中运用到了咱们再界说,也就不必老是修改代码,然后提高代码复用率,削减代码量。
以上便是本章的全部内容。
快来动手试试吧!
假如本专栏对你有帮助,无妨点赞、谈论、关注~