欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift泛型Generics淺析講解

 更新時間:2022年08月24日 08:37:15   作者:撲騰的蛾子  
泛型代碼讓你能根據(jù)你所定義的要求,寫出可以用于任何類型的靈活的、可復用的函數(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ù)據(jù)的處理實現(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
  • swift 3.0 正則表達式查找/替換字符的實現(xiàn)代碼

    swift 3.0 正則表達式查找/替換字符的實現(xiàn)代碼

    正則表達式使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。本文重點給大家介紹swift 3.0 正則表達式查找/替換字符的實現(xiàn)代碼,需要的朋友參考下吧
    2017-08-08
  • Swift實現(xiàn)多個TableView側滑與切換效果

    Swift實現(xiàn)多個TableView側滑與切換效果

    這篇文章主要為大家詳細介紹了Swift實現(xiàn)多個TableView側滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • swift中defer的實際應用小結

    swift中defer的實際應用小結

    這篇文章主要給大家介紹了關于swift中defer的實際應用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 蘋果公司編程語言Swift語言簡介

    蘋果公司編程語言Swift語言簡介

    這篇文章主要介紹了蘋果公司編程語言Swift語言簡介,Swift 是一門新的編程語言,兼容Objective-C代碼,是用來代替Objective-C的蘋果主力開發(fā)語言,需要的朋友可以參考下
    2014-07-07
  • 在Mac OS的終端中運行Swift應用的方法

    在Mac OS的終端中運行Swift應用的方法

    這篇文章主要介紹了在Mac OS的終端中運行Swift應用的方法,依靠Xcode的REPL功能來實現(xiàn),需要的朋友可以參考下
    2015-07-07
  • 使用?Swift?Package?插件生成代碼的示例詳解

    使用?Swift?Package?插件生成代碼的示例詳解

    這篇文章主要介紹了使用?Swift?Package?插件生成代碼,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • swift中可選值?和!使用的方法示例

    swift中可選值?和!使用的方法示例

    這篇文章主要給大家介紹了關于swift中可選值?和!使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • Swift使用enum抹平數(shù)組元素差異實例詳解

    Swift使用enum抹平數(shù)組元素差異實例詳解

    這篇文章主要為大家介紹了Swift使用enum抹平數(shù)組元素差異實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 詳解Swift面向對象編程中的方法(method)

    詳解Swift面向對象編程中的方法(method)

    既然面向對象那就一定會有method,方法和面向過程語言中的function函數(shù)并沒什么區(qū)別,只不過方法在面向對象語言中可以被類來約束作用域,這里我們就來詳解Swift面向對象編程中的方法(method)
    2016-07-07

最新評論