美文网首页
swift基础_泛型(T)

swift基础_泛型(T)

作者: 李永开 | 来源:发表于2023-02-26 21:12 被阅读0次

一. 泛型的使用

func swapValue(_ a: inout Int, _ b: inout Int) {
    (a, b) = (b, a)
}
var a = 1
var b = 2
swapValue(&a, &b)
print("\(a), \(b)") //2, 1

//使用泛型<T>
func swapAllValue<T>(_ a: inout T, _ b: inout T) {
    (a, b) = (b, a)
}
var aa = "10"
var bb = "20"
swapAllValue(&aa, &bb)
print("\(aa), \(bb)")   //20, 10

//继承
class Swapclass<T> {
}
class SubClass<T> : Swapclass<T> {
}

二. 泛型的原理

2.1 看SIL

可以看到调用swapAllValue是这样调用的:

  • swapAllValue<string>("6666666","77777777")
  • swapAllValue<Int>(10, 11)
//使用泛型<T>
func swapAllValue<T>(_ a: inout T, _ b: inout T) {
    (a, b) = (b, a)
}

var a = 10
var b = 11
swapAllValue(&a, &b)

var aa = "66666666666666666"
var bb = "77777777777777777"
swapAllValue(&aa, &bb)

//swapAllValue 函数, 也就是`s4main12swapAllValueyyxz_xztlF`
// swapAllValue<A>(_:_:)
sil hidden @$s4main12swapAllValueyyxz_xztlF : $@convention(thin) <T> (@inout T, @inout T) -> () {
} // end sil function '$s4main12swapAllValueyyxz_xztlF'

//Int值交换 -> apply %14<Int>(%12, %13)
  // function_ref swapAllValue<A>(_:_:)
  %14 = function_ref @$s4main12swapAllValueyyxz_xztlF : $@convention(thin) <τ_0_0> (@inout τ_0_0, @inout τ_0_0) -> () // user: %15
  %15 = apply %14<Int>(%12, %13) : $@convention(thin) <τ_0_0> (@inout τ_0_0, @inout τ_0_0) -> ()

//string值交换 ->  apply %38<String>(%36, %37) 
  // function_ref swapAllValue<A>(_:_:)
  %38 = function_ref @$s4main12swapAllValueyyxz_xztlF : $@convention(thin) <τ_0_0> (@inout τ_0_0, @inout τ_0_0) -> () // user: %39
  %39 = apply %38<String>(%36, %37) : $@convention(thin) <τ_0_0> (@inout τ_0_0, @inout τ_0_0) -> ()

2.2 看汇编

  • 可以看到调用的是同一个函数
//  swapAllValue(&a, &b)     bl    0x102904418
//  swapAllValue(&aa, &bb)   bl    0x102904418

2.3 总结

  • 泛型用的都是一个函数,但是会将推断的类型传进去

三. associatedtype

  • 作用: 给协议中用到的类型定义一个占位名称
  • 协议使用泛型就要用关联类型, 类则是直接使用<T>
  • 协议中可以拥有多个关联类型
protocol Stackable {
    associatedtype Element  //关联类型
    mutating func push(_ element: Element)//mutating是为了Struct也能使用
    func size() -> Int
}
class demoClass : Stackable {
    typealias Element = String//声明Element是String类型,可以省略
    func push(_ element: String) {
        
    }
    func size() -> Int {
        return 100
    }
}

四.类型约束

//类可以有类型约束 -> 泛型必须继承自demoClass
class yueshuclass<T : demoClass> {
    
}

//协议也可以有类型约束 -> Element需要继承自demoClass
protocol StackablePro {
    associatedtype Element : demoClass
    mutating func push(_ element: Element)
    func size() -> Int
}

// 函数的类型约束
func equal<S1: Stackable, S2: Stackable>(_ s1: S1, _ s2: S2) -> Bool where S1.Element == S2.Element, S1.Element : Hashable {
    return false
}

五. 不透明类型 (OpaqueType)

  • some 用来解决协议里面有关联类型报错问题
protocol Stackable {
    associatedtype Element  //关联类型
    mutating func push(_ element: Element)//mutating是为了Struct也能使用
    func size() -> Int
}
class demoClass : Stackable {
    typealias Element = String//声明Element是String类型,可以省略
    func push(_ element: String) {
        
    }
    func size() -> Int {
        return 100
    }
}
func opaqueType(_ type: Int) ->  some Stackable {
    return demoClass()
}
// any是干嘛的...不知道...
func opaqueType1(_ type: Int) ->  any Stackable {
    return demoClass()
}

相关文章

  • 2017-12-26

    swift泛型的使用 ''' func exchange( a: inout T, b : inout T){//...

  • Swift:泛型

    Generics github:Swift基础实例github:SwiftBasicTableView 泛型 简介...

  • 泛型

    Swift 泛型 泛型主要用于解决代码的抽象能力 + 代码的复用性 例如下面的例子,其中的T就是泛型 类型约束 在...

  • iOS开发 - 「Swift 学习」Swift泛型

    Swift泛型 泛型函数 以上是交换两个任意相同类型值的泛型函数,T是一个占位命名类型,swift不会查找命名为T...

  • Swift-泛型笔记

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

  • [ WWDC2018 ] - Swift 泛型 Swift Ge

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

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

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

  • 2021-12-01

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

  • swift 泛型

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

  • 使用Web浏览器编译Swift代码,及Swift中的泛型

    使用Web浏览器编译Swift代码,及Swift中的泛型 使用Web浏览器编译Swift代码,及Swift中的泛型

网友评论

      本文标题:swift基础_泛型(T)

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