`

Swift泛型和泛型函数

 
阅读更多

泛型(generic)可以使我们在程序代码中定义一些可变的部分,在运行的时候指定。使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。在Swift集合类中,已经采用了泛型。
一、一个问题的思考
怎样定义一个函数来判断两个参数是否相等呢?
如果参数是Int类型,则函数定义如下:
func isEqualsInt(a:Int, b:Int) -> Bool {
    return (a == b)
}
这个函数参数列表是两个Int类型,它只能比较两个Int类型参数是否相等。如果我们想比较两个Double类型是否相等,可以修改上面定义的函数如下:
func isEqualsDouble(a:Double, b:Double) -> Bool {
    return (a == b)
}
这个函数参数列表是两个Double类型,它只能比较两个Double类型参数是否相等。如果我们想比较两个String类型是否相等,可以修改上面定义的函数如下:
func isEqualsString(a:String, b:String) -> Bool {
    return (a == b)
}
以上我们分别对3种不同的类型进行了比较,定义了类似的3个函数。那么我们是否可以定义1个函数能够比较3种不同的类型呢?如果isEqualsInt、isEqualsDouble和isEqualsString这3个函数名字后面的Int、Double和String是可变的,那么这些可变部分是与参数类型关联的。 
二、泛型函数
我们可以改造上面的函数,修改内容如下:
func isEquals<T>(a: T, b: T) -> Bool {   ①
    return (a == b)
}
在函数名isEquals后面添加<T>,参数的类型也被声明为T,T称为占位符,函数在每次调用时传入实际类型才能决定T所代表的类型。如果有多个不同类型,可以使用其他大写字母,一般情况下我们习惯于使用U字母,但是你也可以使用其他的字母。多个占位符用逗号“,”分隔,示例如下:
func isEquals<T, U>(a: T, b: U) -> Bool {...}
占位符不仅仅可以替代参数类型,还可以替代返回值类型。示例代码如下:
func isEquals<T>(a: T, b: T) -> T {...}
事实上,上面第①行的函数在编译时会有错误发生,这是因为并不是所有的类型都具有“可比性”,它们必须遵守Comparable协议实现类型。Comparable协议表示可比较的,在Swift中,基本数据类型以及字符串都是遵守Comparable协议的。
修改代码如下:

[html] view plaincopy
 
  1. func isEquals<T: Comparable>(a: T, b: T) -> Bool {  ②  
  2.     return (a == b)  
  3. }  



我们需要在T占位符后面添加冒号和协议类型,这种表示方式被称为泛型约束,它能够替换T的类型。在本例中,T的类型必须遵守Comparable协议的具体类。
我们可以通过下列代码测试第②行代码定义的函数:

[html] view plaincopy
 
  1. let n1 = 200  
  2. let n2 = 100  
  3.   
  4.   
  5. println(isEquals(n1, n2))  
  6.   
  7.   
  8. let s1 = "ABC1"  
  9. let s2 = "ABC1"  
  10.   
  11.   
  12. println(isEquals(s1, s2))  



分别传递两个Int参数和String参数进行比较,运行结果如下:
false
true
运行结果无需解释了。泛型在很多计算机语言中都有采用,基本含义都是类似的,但是小的差别还是有的。

 

 

 

 

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

 

 

 

 

 

欢迎关注智捷iOS课堂微信公共平台

分享到:
评论

相关推荐

    探索Swift泛型的魔力:编写灵活且可重用的代码

    Swift还提供了现代化的语言特性,如泛型、协议扩展、函数式编程模式等,使得代码更加简洁、易读和富有表现力。 此外,Swift是开源项目,拥有活跃的社区,开发者可以在GitHub上找到Swift的源代码并参与贡献。Swift...

    函数式 Swift

    在Swift中,函数式编程的特点体现在许多语言特性中,如高阶函数、闭包、泛型和类型推断等。本书通过实例和实践,帮助读者理解这些概念并掌握它们的应用。 首先,我们来谈谈Swift中的高阶函数。高阶函数是可以接受一...

    解析Swift中的泛型支持与使用

    Swift是一种强大的编程语言,它的泛型功能使得开发者能够...通过泛型,我们可以创建通用的函数和类型,同时通过约束和`where`子句确保代码的正确性和安全性。理解和熟练运用泛型是成为Swift开发高手的关键步骤之一。

    Swift编程中的泛型解析

    泛型代码可以让你写出根据自我需求定义、适用于任何类型的,灵活且可重用的函数和类型。它可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码的意图。   泛型是 Swift 强大特征中的其中一个,许多 Swift ...

    swift-ScreenFeature泛型编程开发适配工具

    总之,`ScreenFeature`是一个利用Swift泛型编程技术的开发工具,旨在简化iOS应用的屏幕适配工作,提供灵活、可复用且类型安全的解决方案。通过理解和使用这个工具,开发者可以更高效地构建适应各种设备和屏幕尺寸的...

    函数式Swift 已对应 Swift 4

    总的来说,《函数式Swift》这本书涵盖了如何在Swift 4环境中利用函数式编程的思想和特性来优化代码,提高开发效率,以及如何与其他开发工具和框架(如RXSwift)配合,以实现更高效、更优雅的iOS应用程序开发。...

    Swift 函数式编程高清正版

    Swift函数式编程是一种将函数作为一等公民的编程范式,它强调程序的数据流和变换,而不是对状态和可变数据的操作。在Swift中,函数式编程的思想与面向对象编程和命令式编程相结合,提供了丰富的工具和概念来帮助...

    swift4函数式编程学习

    5. **泛型**:Swift4的泛型支持使得函数和类型可以处理多种不同的数据类型,增强了代码的重用性。在函数式编程中,泛型常用于创建通用的高阶函数。 6. **Optionals**:Swift的可选类型(Optionals)是函数式编程的...

    swift3.0函数手册

    1. 函数:Swift中的函数是头等公民,支持高阶函数和闭包。 2. 闭包:Swift提供了对闭包的完整支持,闭包是自包含的函数,可以在代码中被传递和使用。 3. 枚举:枚举在Swift中是具有类型安全的值类型,能够包含方法、...

    swift 4资料(swift4进阶和函数式swift4、以及swift4.2更新内容和XCode10更新内容)

    在这个资料包中,我们将深入探讨Swift 4的进阶特性,函数式编程在Swift中的应用,以及Swift 4.2和Xcode 10带来的更新内容。 首先,让我们关注Swift 4的进阶特性。Swift 4的一大亮点是它的类型系统,它确保了编译时...

    Objc中国 - 函数式Swift(对应Swift4)

    “没有 C 的 Objective-C” 确实是在做减法,但是 Swift 引入了泛型和函数式编程的概念,这极大扩展了语言设计的空间。 在 Swift 中引入函数式编程为我们的开发带来了无限的乐趣。在本书中我们将阐述函数式编程的...

    Swift教程:函数篇 函数类型

    泛型允许我们定义可以应用于多种数据类型的通用函数和类型。在泛型函数中,函数类型可以作为类型约束,确保传递给函数的闭包遵循特定签名: ```swift func apply(to elements: [T], transform: (T) -&gt; T) -&gt; [T] { ...

    objc swift函数式编程+进阶 (swift 4.0)

    综上所述,这个主题会涵盖Swift 4.0中的函数式编程技巧,包括但不限于高阶函数的应用、闭包的使用、类型推断和泛型,以及与其他编程范式的对比。通过学习这些内容,开发者能够提升代码的可读性、可维护性和效率,更...

Global site tag (gtag.js) - Google Analytics