最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift泛型Generics淺析講解

 更新時間:2022年08月24日 08:37:15   作者:撲騰的蛾子  
泛型代碼讓你能根據你所定義的要求,寫出可以用于任何類型的靈活的、可復用的函數(shù)。泛型是 Swift 最強大的特性之一,很多 Swift 標準庫是基于泛型代碼構建的

泛型(Generics)

1、泛型可以將類型參數(shù)化,提高代碼復用率,減少代碼量

func swapValue<T>(_ a: inout T, _ b: inout T) -> Void {
    (a, b) = (b, a)
}
var fn: (inout Int, inout Int) -> () = swapValue

class Stack<E> {
    var elements = [E]()
    func push(_ element: E) -> Void {
        elements.append(element)
    }
    func pop() -> E {
        elements.removeLast()
    }
    func top() -> E {
        elements.last!
    }
    func size() -> Int {
        elements.count
    }
}
var intStack = Stack<Int>()
var stringStack = Stack<String>()
var anyStack = Stack<Any>()
class SubStack<E>: Stack<E> {
}
struct Stack<E> {
    var elements = [E]()
    mutating func push(_ element: E) {
        elements.append(element)
    }
    mutating func pop() -> E {
        elements.removeLast()
    }
    func top() -> E {
        elements.last!
    }
    func size() -> Int {
        elements.count
    }
}

匯編分析泛型的實現(xiàn)原理

通過匯編我們可以看到兩次調用的swapValues方法的地址是相同的,也就是說是相同的方法,匯編中有關于metadata的信息,所以推測Swift中的泛型是通過對元數(shù)據的處理實現(xiàn)的。

關聯(lián)類型(Associated Type)

1、關聯(lián)類型的作用:給協(xié)議中用到的類型定義一個占位名稱

2、協(xié)議中可以擁有多個關聯(lián)類型

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) -> Void {
        elements.append(element)
    }
    func pop() -> String {
        elements.removeLast()
    }
    func top() -> String {
        elements.last!
    }
    func size() -> Int {
        elements.count
    }
}

類型約束

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

更多的約束

func equal<S1: Stackable, S2: Stackable>(_ s1: S1, _ s2: S2) -> Bool
where S1.Element == S2.Element, S1.Element: Hashable
{
    return false
}

協(xié)議類型的注意點

protocol Runnable {}
class Person: Runnable {}
class Car: Runnable {}
func getObject(_ type: Int) -> Runnable {
    if type == 0 {
        return Person()
    }
    return Car()
}
var r1 = getObject(0)
var r2 = getObject(1)

1、如果協(xié)議中有associatedtype,那么會有類型識別不了的問題,以下代碼會報錯

protocol Runnable {
    associatedtype Speed
    var speed: Speed {
        get
    }
}
class Person: Runnable {
    var speed: Double {
        0.0
    }
}
class Car: Runnable {
    var speed: Int {
        0
    }
}
func getObject(_ type: Int) -> Runnable {
    if type == 0 {
        return Person()
    }
    return Car()
}

泛型解決

解決方案1:使用泛型

protocol Runnable {
    associatedtype Speed
    var speed: Speed {
        get
    }
}
class Person: Runnable {
    var speed: Double {
        0.0
    }
}
class Car: Runnable {
    var speed: Int {
        0
    }
}
func getObject<T: Runnable>(_ type: Int) -> T {
    if type == 0 {
        return Person() as! T
    }
    return Car() as! T
}
var r1: Person = getObject(0)
var r2: Car = getObject(1)

不透明類型(Opaque Type)

1、解決方案2:使用some關鍵字聲明一個不透明類型

func getObject(_ type: Int) -> some Runnable {
    return Car()
}

2、some限制只能返回一種類型

some

1、some除了用在返回值類型上,一般還可以用在屬性類型上

protocol Runnable {
    associatedtype Speed
}
class Dog: Runnable {
    typealias Speed = Double
}
class Person {
    var pet: some Runnable {
        return Dog()
    }
}

到此這篇關于Swift泛型Generics淺析講解的文章就介紹到這了,更多相關Swift Generics內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Swift編程中的方法與屬性的概念

    詳解Swift編程中的方法與屬性的概念

    這篇文章主要介紹了Swift編程中的方法與屬性的概念,是Swift入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • swift3.0鍵盤彈起遮擋輸入框問題的解決方案

    swift3.0鍵盤彈起遮擋輸入框問題的解決方案

    這篇文章主要介紹了swift3.0鍵盤彈起遮擋輸入框問題的解決方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • 深入淺出的聊聊Swift高階函數(shù)

    深入淺出的聊聊Swift高階函數(shù)

    函數(shù)式編程就是高階函數(shù)編程的應用,所以要熟練掌握基礎的高階函數(shù)是必須的filter、map、reduce、flatmap就是必備的高階函數(shù),這篇文章主要給大家介紹了關于Swift高階函數(shù)的相關資料,需要的朋友可以參考下
    2021-09-09
  • switch循環(huán)所支持的數(shù)據類型案例分析

    switch循環(huán)所支持的數(shù)據類型案例分析

    這篇文章主要介紹了switch循環(huán)所支持的數(shù)據類型,本文通過實際案例講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Swift中常量和變量的區(qū)別與聲明詳解

    Swift中常量和變量的區(qū)別與聲明詳解

    Swift語言同樣和Java和OC等語言一樣是同樣是需要聲明常量和變量的,下面就讓我們來學習一下Swift的常量和變量。這篇文章主要給大家介紹了關于Swift中常量和變量的區(qū)別與聲明的相關資料,需要的朋友可以參考下。
    2017-11-11
  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關聯(lián)到一個特定類型的函數(shù),類、結構、枚舉所有可以定義實例方法,封裝特定任務和功能處理給定類型的一個實例,需要的朋友可以參考下
    2015-01-01
  • Swift利用CoreData實現(xiàn)一個上班簽到的小工具

    Swift利用CoreData實現(xiàn)一個上班簽到的小工具

    這篇文章主要給大家介紹了關于Swift利用CoreData實現(xiàn)一個上班簽到小工具的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-12-12
  • 初步理解Swift中的泛型

    初步理解Swift中的泛型

    這篇文章主要介紹了初步理解Swift中的泛型,是Swift入門學習中的基礎知識,需要的朋友可以參考下
    2015-07-07
  • RxSwift使用技巧之過濾操作詳解

    RxSwift使用技巧之過濾操作詳解

    RxSwift的目的是讓讓數(shù)據/事件流和異步任務能夠更方便的序列化處理,能夠使用Swift進行響應式編程,下面這篇文章主要給大家介紹了關于RxSwift使用技巧之過濾操作的相關資料,需要的朋友可以參考下。
    2017-09-09
  • Swift的開發(fā)環(huán)境搭建以及基本語法詳解

    Swift的開發(fā)環(huán)境搭建以及基本語法詳解

    這篇文章主要介紹了Swift的開發(fā)環(huán)境搭建以及基本語法詳解,是Swift入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11

最新評論

疏附县| 菏泽市| 全椒县| 永康市| 英超| 长岭县| 崇礼县| 德惠市| 揭东县| 府谷县| 江油市| 沐川县| 尼玛县| 米脂县| 南乐县| 利辛县| 朝阳县| 南宫市| 温宿县| 金沙县| 仁化县| 永登县| 龙口市| 朝阳县| 江门市| 石河子市| 定边县| 建德市| 定州市| 莒南县| 柳林县| 读书| 金坛市| 读书| 乐陵市| 凤冈县| 安丘市| 慈溪市| 永川市| 宁城县| 南京市|