美文网首页
第二十九章 Swift 泛型

第二十九章 Swift 泛型

作者: 我有小尾巴快看 | 来源:发表于2019-06-07 13:16 被阅读0次

Swift 提供了泛型让你写出灵活且可重用的函数和类型。

1. 集合类

在Swift的集合类中,元素类型是必须指定的,如果元素类型不同,则需要指定为AnyAnyObject

class Peron {
    
}

class User {
    
}

var arr = [Peron]()
arr.append(Peron())
arr.append(User()) // error: Cannot convert value of type 'User' to expected argument type 'Peron'

如果你试图违反指定的泛型进行操作,编译器会报错。

2. 指定参数类型

当我们有一个函数、算法可以运用给多种类型时,在OC中只能指派给父类或id类型,填参时没关系,但是相关返回值则不是我们所期望的。

Swift泛型则可以完美解决这种问题。

struct Number<T> {
    var value: T
    
    init(value: T) {
        self.value = value
    }
}

let num1 = Number.init(value: 5)   // num1.value: Int = 5
let num2 = Number.init(value: 5.5) // num2.value: Double = 5.5

3. 对泛型进行约束

很多时候,我们只会有其中有限的场景进行我们的修改,不想影响到其他的场景,那么我们可以给泛型进行约束。

struct Number<T: Numeric> {
    var value: T
    
    init(value: T) {
        self.value = value
    }
}

let num1 = Number.init(value: 5)   // num1.value: Int = 5
let num2 = Number.init(value: 5.5) // num2.value: Double = 5.5
let num3 = Number.init(value: "Apple") // error: Argument type 'String' does not conform to expected type 'Numeric'

上例约束了泛型T必须实现Numeric协议,故传入的String类型会报错,而IntDouble则没有受到影响。

我们也可以在扩展中对泛型进行约束,这里对Int类型的T进行了扩展,添加了一个log函数,Double类型的T调用会报错。

extension Number where T == Int {
    func log() {
        print("Int value: \(self.value)")
    }
}

num1.log() // Int value: 5
num2.log() // 'Number<Double>' is not convertible to 'Number<Int>'

相关文章

  • Swift-泛型笔记

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

  • [ WWDC2018 ] - Swift 泛型 Swift Ge

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

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

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

  • 第二十九章 Swift 泛型

    Swift 提供了泛型让你写出灵活且可重用的函数和类型。 1. 集合类 在Swift的集合类中,元素类型是必须指定...

  • 2021-12-01

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

  • swift 泛型

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

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

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

  • 【Swift】泛型常见使用

    1、Swift泛型4种 泛型函数泛型类型泛型协议泛型约束 2、泛型约束3种 继承约束:泛型类型 必须 是某个类的子...

  • OneDayOneSwift[23] - Generics

    泛型是 Swift 的强大特性之一,许多 Swift 标准库是通过泛型代码构建的。事实上,泛型的使用贯穿了整本语言...

  • Swift和OC的区别

    Swift和OC的区别? 1、Swift没有地址和指针的概念 2、Swift对数据类型要求极为严谨 3、泛型,泛型...

网友评论

      本文标题:第二十九章 Swift 泛型

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