美文网首页
Swift语法 -- [15 - 泛型]

Swift语法 -- [15 - 泛型]

作者: happy神悦 | 来源:发表于2020-10-28 09:23 被阅读0次

1.介绍

泛型代码让你能根据你所定义的要求写出可以用于任何类型的灵活的、可复用的函数,泛型是 Swift 最强大的特性之一,很多 Swift 标准库是基于泛型代码构建的

泛型可以将类型参数化,提高代码复用率,减少代码量

2.泛型函数

泛型函数可以用于任何类型, 函数用了一个占位符类型名(这里叫做 T ),占位符类型名没有声明 T 必须是什么样的,但是它确实说了 a 和 b 必须都是同一个类型 T ,或者说都是 T 所表示的类型。,下面的例子: T会自动推断为Int 类型

func swapValues<T>(_ a: inout T, _ b: inout T) { 
    (a, b) = (b, a)
}

var i1 = 10
var i2 = 20
swapValues(&i1, &i2)

3. 泛型类型

除了泛型函数,Swift允许你定义自己的泛型类型。它们是可以用于任意类型的自定义类、结构体、枚举,和 Array 、 Dictionary 方式类似。

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

var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")

4.关联类型(Associated Type)

定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。关联类型通过 associatedtype 关键字指定。

  • 关联类型的作用:给协议中用到的类型定义一个占位名称
  • 协议中可以拥有多个关联类型
protocol Stackable {
    associatedtype Element // 关联类型 
    mutating func push(_ element: Element)  
    mutating func pop() -> Element
    func top() -> Element
    func size() -> Int
}

class StringStack : Stackable {
    // 给关联类型设定真实类型
    // typealias Element = String
    var elements = [String]()
    func push(_ element: String) { elements.append(element) } func pop() -> String { elements.removeLast() }
    func top() -> String { elements.last! }
    func size() -> Int { elements.count } }
var ss = StringStack()
ss.push("Jack")
ss.push("Rose")

5.类型约束

类型约束指出一个类型形式参数必须继承自特定类,或者遵循一个特定的协议、组合协议。

 protocol Runnable { }
        class Person { }
        func swapValues<T : Person & Runnable>(_ a: inout T, _ b: inout T) {
            (a, b) = (b, a)
        }
}

6.可选项的本质

可选项的本质是enum类型

public enum Optional<Wrapped> : ExpressibleByNilLiteral { 
    case none
    case some(Wrapped)
    public init(_ some: Wrapped) 
}

var age: Int? = 10
var age0: Optional<Int> = Optional<Int>.some(10) var age1: Optional = .some(10)
var age2 = Optional.some(10)
var age3 = Optional(10)
age = nil
age3 = .none

相关文章

  • Swift语法 -- [15 - 泛型]

    1.介绍 泛型代码让你能根据你所定义的要求写出可以用于任何类型的灵活的、可复用的函数,泛型是 Swift 最强大的...

  • 2021-12-01

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

  • 泛型

    泛型 1.为什么要有泛型?2.泛型有什么好处?3.Swift泛型语法4.泛型的使用 为什么要有泛型 在编程世界中,...

  • iOS学习笔记47-Swift(七)泛型

    一、Swift泛型介绍 泛型是为Swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引...

  • Swift 中的泛型

    Swift泛型介绍 泛型是为Swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引入可...

  • swift泛型

    一、swift泛型介绍 泛型是为swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引...

  • Swift-泛型笔记

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

  • [ WWDC2018 ] - Swift 泛型 Swift Ge

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

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

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

  • Java泛型详解

    一、泛型简介 1.引入泛型的目的 了解引入泛型的动机,就先从语法糖开始了解。 语法糖 语法糖(Syntactic ...

网友评论

      本文标题:Swift语法 -- [15 - 泛型]

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