Swift-泛型
发布日期:2022-03-18 08:27:40 浏览次数:34 分类:技术文章

本文共 2510 字,大约阅读时间需要 8 分钟。

Swift-泛型

参考:

Swift 的 ArrayDictionary 都是泛型集合

泛型函数

如下的函数pairsFromDictionary

func pairsFromDictionary
(dictionary: [KeyType: ValueType]) -> [(KeyType, ValueType)] { return Array(dictionary)}

使用情况如下:

let pairs = pairsFromDictionary(["minimum": 199, "maximum": 299])let morePairs = pairsFromDictionary([1: "Swift", 2: "Generics", 3: "Rule"])

使用泛型来定义栈和队列

struct Stack
{ var items = [Element]() mutating func push(item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() }}

方法被标记为 mutating,因为它们需要修改结构体的 items 数组

队列

struct Queue
{ private var elements = [Element]() mutating func enqueue(newElement: Element){ elements.append(newElement) } mutating func dequeue() -> Element? { guard !elements.isEmpty else { return nil } return elements.removeAtIndex(0) } func peek() -> Element? { return elements.first }}

类型约束

类型约束可以指定一个类型参数必须继承自指定类,或者符合一个特定的协议或协议组合。

例如,Swift 的 Dictionary 类型对字典的键的类型做了些限制。在字典的描述中,字典的键的类型必须是可哈希(hashable)的。也就是说,必须有一种方法能够唯一地表示它。Dictionary 的键之所以要是可哈希的,是为了便于检查字典是否已经包含某个特定键的值。若没有这个要求,Dictionary 将无法判断是否可以插入或者替换某个指定键的值,也不能查找到已经存储在字典中的指定键的值。

如下,在数组中查找是否有需要查找的值:

func findIndex
(array: [T], _ valueToFind: T) -> Int? { for (index, value) in array.enumerate() { if value == valueToFind { return index } } return nil}

但是,这个函数无法通过编译,原因是不是所有的 Swift 类型都可以用等式符(==)进行比较。

Swift 标准库中定义了一个 Equatable 协议,该协议要求任何遵循该协议的类型必须实现等式符(==)及不等符(!=),从而能对该类型的任意两个值进行比较。所有的 Swift 标准类型自动支持 Equatable 协议。

所以,修改后的函数是:

func findIndex
(array: [T], _ valueToFind: T) -> Int? { for (index, value) in array.enumerate() { if value == valueToFind { return index } } return nil}

也可使用where来约束类型:

func mid
(array: [T]) -> T { return array.sort()[(array.count - 1) / 2]}

sort()要可用,需要array遵循Comparable协议。

等同于:

func mid
(array: [T]) -> T { return array.sort()[(array.count - 1) / 2]}

继承泛型类

例如有如下的泛型类:

class Box
{}

有如下的两种继承方式:

class Gift
: Box
{}class StringBox: Box
{}

Enums With Multiple Generic Associated Values

如下的泛型enum有两个关联的值:一个用来表示实际的结果,一个用来表示可能的错误。

enum Result
{ case Success(ValueType) case Failure(ErrorType)}

使用情况如下:

func divideOrError(x: Int, y: Int) -> Result
{ guard y != 0 else { return Result.Failure("Division by zero is undefined") } return Result.Success(x / y)}

转载地址:https://windzen.blog.csdn.net/article/details/53100512 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Swift中的协议
下一篇:iOS自定义控件一

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月29日 11时11分53秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章