Skip to content

SwiftTips99

Lefe_x edited this page Jul 22, 2019 · 8 revisions

实践是检验真理的唯一标准,学习 Swift 也是这样,刚懂语法还不行,要从项目「实践」中不断磨练,提练出好的思想。SwiftTips99 是知识小集从各大开源库中提炼出的 Swift 知识点,打算总结 99 条,学习 tip 的时候掌握语法规则。

SwiftTips99 - 01 泛型与协议的使用


作者: Lefe_x

选自:swift-algorithm-club

public class RBTreeNode<T: Comparable>: Equatable {}

SwiftTips99 是知识小集新出推的一种小集类型,主要从开源库中总结 Swift 中实用、常用、好用的知识点,内容不会太难,一切从实际出发。今天的内容是关于 Swift 中的泛型和协议的使用。

节选的代码片段中,RBTreeNode定义的是一个树的节点类,树中节点表示的值往往不同,比如整形、浮点型、自定义类型等。RBTreeNode<T: Comparable>的定义表明了这个节点可以是「具有可比性」的任意类型数据。实现Comparable协议的数据类型需要实现<, >, <=, >=这4种比较运算符。而节点本身需要实现 Equatable 协议,也就是需要实现 == 符号。

数据结构中常会使用到泛型,比如定义一个栈,如果把栈定义成一个整形的栈,那么大大缩小了它的应用范围。定义栈往往类似下面这种方式。

struct Stack<Element> { }

函数中泛型的使用,使用多个泛型:

override func viewDidLoad() {
    super.viewDidLoad()
    sswapp(a: 2, b: "ff")
}

func sswapp<T, U>(a: T, b: U) {

}

总之,泛型可以减少「重复代码」,协议可以「约束」数据类型,写出更好用的代码。


小集

Clone this wiki locally