美文网首页
Swift 泛型与重载

Swift 泛型与重载

作者: lsh_01 | 来源:发表于2019-02-22 13:05 被阅读0次

编译器在编译泛型函数时,会根据实参类型,以泛型函数为模板,合成对应的函数。
如果泛型函数有重载版本,编译器会以最接近实参类型的泛型函数为模板,进行函数合成。

eg1:

func test_func<T>(_ s: T) {
    print(type(of: s), s)
}

func doTest() {
    let a: Int = 1
    let b: Int? = 2
    let c: Int? = nil
    
    test_func(a)
    test_func(b)
    test_func(c)
}

合成的函数是:

func test_func(_ s: Int) {
    // let a: Int = 1 执行这个函数
    print(type(of: s), s) 
}

func test_func(_ s: Optional<Int>) {
    // let b: Int? = 2 和 let c: Int? = nil 执行这个函数
    print(type(of: s), s) 
}

执行结果是:

let a: Int = 1         Int             1
let b: Int? = 2        Optional<Int>   Optional(2)
let c: Int? = nil      Optional<Int>   nil

eg2:

func test_func<T>(_ s: T?) {
    print(type(of: s), s, terminator: "")
    if s != nil {
        print(type(of: s!), s!)
    } else {
        print("error")
    }
}

func doTest() {
    let a: Int = 1
    let b: Int? = 2
    let c: Int? = nil
    
    test_func(a)
    test_func(b)
    test_func(c)
}

合成的函数是:

func test_func(_ s: Int?) {
    print(type(of: s), s, terminator: "")
    if s != nil {
        print(type(of: s!), s!)
    } else {
        print("error")
    }
}

执行结果是:

let a: Int = 1         Optional<Int>   Optional(1) Int 1
let b: Int? = 2        Optional<Int>   Optional(2) Int 2
let c: Int? = nil      Optional<Int>   nil         error

eg3:

func test_func<T>(_ s: T) {
    print(type(of: s), s)
}

func test_func<T>(_ s: T?) {
    print(type(of: s), s, terminator: "")
    if s != nil {
        print(type(of: s!), s!)
    } else {
        print("error")
    }
}

func doTest() {
    let a: Int = 1
    let b: Int? = 2
    let c: Int? = nil
    
    test_func(a)
    test_func(b)
    test_func(c)
}

合成的函数是:

func test_func(_ s: Int) {
    // let a: Int = 1 执行这个函数
    print(type(of: s), s) 
}

func test_func(_ s: Int?) {
    // let b: Int? = 2 和 let c: Int? = nil 执行这个函数
    print(type(of: s), s, terminator: "") 
    if s != nil {
        print(type(of: s!), s!)
    } else {
        print("error")
    }
}

执行结果是:

let a: Int = 1         Int             1
let b: Int? = 2        Optional<Int>   Optional(2) Int 2
let c: Int? = nil      Optional<Int>   nil         error

应用

自定义LSPrint函数,能够准确判断参数items的类型,并且获取到其值。

#if DEBUG
public func LSPrint(file: String = #file, line: UInt = #line, function: String = #function) {
    print("\t" + (file as NSString).lastPathComponent + " [\(line)] " + function)
}
public func LSPrint<T>(_ items: @autoclosure () -> T, file: String = #file, line: UInt = #line, function: String = #function) {
    let result = items()
    print("\t" + (file as NSString).lastPathComponent + " [\(line)] " + function + " 输出: \(type(of: result))\n\(result)")
}
public func LSPrint<T>(_ items: @autoclosure () -> T?, file: String = #file, line: UInt = #line, function: String = #function) {
    let result = items()
    if result != nil {
        print("\t" + (file as NSString).lastPathComponent + " [\(line)] " + function + " 输出: \(type(of: result))\n\(result!)")
    } else {
        print("\t" + (file as NSString).lastPathComponent + " [\(line)] " + function + " 输出: \(type(of: result)) = nil")
    }
}
#else
    public func LSPrint(_ items: @autoclosure () -> Any? = nil) {}
#endif

相关文章

  • Swift 泛型与重载

    编译器在编译泛型函数时,会根据实参类型,以泛型函数为模板,合成对应的函数。如果泛型函数有重载版本,编译器会以最接近...

  • 泛型auto

    泛型auto 重载 默认参数

  • Swift-泛型笔记

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

  • [ WWDC2018 ] - Swift 泛型 Swift Ge

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

  • 理顺iOS(一)泛型

    1.1 泛型介绍 泛型的概念最早出自C++,Swift的泛型与其设计思路相同,与Java不同。 优缺点 C++与S...

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

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

  • 2021-12-01

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

  • swift 泛型

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

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

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

  • swfit-泛型

    和大多先进编程语言一样,swift拥有不少可以归类 泛型编程 的特性. 重载 拥有同样的名字,但是参数和返回类型不...

网友评论

      本文标题:Swift 泛型与重载

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