Swift学习笔记-泛型

作者: 土豆吞噬者 | 来源:发表于2018-11-04 23:56 被阅读0次

泛型能让我们使用的类型和函数使用未知的类型,许多内置类型,例如可空类型,数组和字典都是用泛型实现的。

泛型类型

下面的结构体实现了一个简单的栈,可以对Int类型执行push和pop操作。

struct Stack{
    var items = [Int]()
    
    mutating func push(newitem:Int){
        items.append(newitem)
    }
    
    mutating func pop() ->Int?{
        guard !items.isEmpty else{
            return nil
        }
        return items.removeLast()
    }
    
}

var stack=Stack()
stack.push(newitem:1)
stack.push(newitem:2)
print(stack.pop())
print(stack.pop())

但是如果我们需要对其他类型进行入栈和出栈操作,那就得再编写一个栈类型,使用泛型可以让这个栈支持任意类型。改写后的代码如下,Swift的泛型语法和Java差不多。

struct Stack<T>{
    var items = [T]()
    
    mutating func push(newitem:T){
        items.append(newitem)
    }
    
    mutating func pop() ->T?{
        guard !items.isEmpty else{
            return nil
        }
        return items.removeLast()
    }
    
}

var stack=Stack<Int>()
stack.push(newitem:1)
stack.push(newitem:2)
print(stack.pop())
print(stack.pop())

多个占位类型

泛型可支持多个占位类型,代码如下。

struct Stack<T,U,X>{
    var items = [T]()
    var items1 = [U]()
    var items2 = [X]()
    ...
}
var stack=Stack<Int,String,Double>()

泛型函数和方法

泛型函数需要在函数参数列表前声明占位类型,然后可以在参数和返回值中使用这些占位类型。

func getSelf<T>(arg:T)->T{
    return arg
}

print(getSelf(arg: "hello world!"))

类型约束

有时候我们需要对传入的类型做一些限制,可以通过类型约束实现,有两种约束:一种是类型必须是给定类的子类,还有一种是类型必须符合一个协议。

func checkEqual<T:Equatable>(first:T,second:T)->Bool{
    return first==second
}
print(checkEqual(first: 1, second: 1))
print(checkEqual(first: "123", second: "456"))

当占位类型比较复杂时,我们还可以使用where语句进一步约束占位类型,如下代码要求newitems的元素必须是T类型。

struct Stack<T>{
    var items = [T]()
    
    mutating func push(newitem:T){
        items.append(newitem)
    }
    
    mutating func pushAll<S:Sequence>(newitems:S)
        where S.Iterator.Element==T {
            for item in newitems {
                self.push(newitem: item)
                print("push \(item)")
            }
    }
    
    mutating func pop() ->T?{
        guard !items.isEmpty else{
            return nil
        }
        return items.removeLast()
    }
}


var stack=Stack<Int>()
stack.pushAll(newitems:[1,2,3,4,5,6])

关联类型协议

协议不支持泛型,但是支持另外一种特性:关联类型,在协议内部可以使用associatedtype关键字声明一个占位类型,符合这个协议的类型应该在其内部为占位类型提供typealias定义。

protocol InteratorProtocol {
    associatedtype Element
    mutating func next() -> Element?
}


struct Stack<T>:InteratorProtocol {
    typealias Element = Int
    
    mutating func next() -> Element? {
        return 0
    }
}

相关文章

  • 《Swift从入门到精通》(十九):泛型

    泛型(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 泛型可解决的问题如两个 Int 类型交...

  • swift 泛型

    Swift-泛型学习和实例总结 - Mazy's Blog - CSDN博客 Swift中的泛型 - 简书

  • Swift学习笔记-泛型

    泛型能让我们使用的类型和函数使用未知的类型,许多内置类型,例如可空类型,数组和字典都是用泛型实现的。 泛型类型 下...

  • Swift学习笔记--泛型

    泛型 原文链接 泛型代码让你能根据你所定义的要求写出可以用于任何类型的灵活的、可复用的函数。你可以编写出可复用、意...

  • Swift-泛型笔记

    Swift 泛型 Swift 提供了泛型让你写出灵活且可重用的函数和类型。 Swift 标准库是通过泛型代码构建出...

  • [ WWDC2018 ] - Swift 泛型 Swift Ge

    Swift 泛型历史 我们首先来回顾一下 Swift 中对于泛型支持的历史变更,看看现在在 Swift 中,泛型都...

  • Swift 运用协议泛型封装网络层

    Swift 运用协议泛型封装网络层 Swift 运用协议泛型封装网络层

  • 2021-12-01

    swift5基本语法-泛型函数和泛型类型 Swift中泛型可以将类型参数化,提高代码复用率,减少代码量。 一、泛型...

  • Swift泛型笔记

    泛型可以让代码处理类型更加灵活,在某些场景下可以很大程度的重用代码,泛型是什么,使用泛型的好处,这里不多说,网上有...

  • Swift学习:泛型

    本篇将详细总结介绍Swift泛型的用法;Swift泛型代码让你能够根据自定义的需求,编写出适用于任意类型、灵活可重...

网友评论

    本文标题:Swift学习笔记-泛型

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