Swift入门教程19-泛型

原创Blog,转载请注明出处

blog.csdn.net/hello_hwc

一 泛型的定义

和C++的类似,泛型定义了一种适用于任何类型的,可重用的代码,用一种抽象的方式来实现代码。Swift的Array和Dictionary都是用泛型来实现的,因为Array可以保存String类型的变量,也可以保存Int类型的。

举个例子

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a=b
    b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
        let temporaryA = a
        a=b
        b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
        let temporaryA = a
        a=b
        b = temporaryA
}

这是同样的函数结构用来交换两种类型,但是不用泛型的话,我们不得不为每一种类型都定义出对应的函数。十分繁琐。

使用泛型之后,我们只需要这样去定义

func swapTwoValues<T>(inout a: T, inout b: T) { let temporaryA = a
    a=b
    b = temporaryA
}

这里的T是占为类型,就是告诉编译器,这是个通用的类型,在实际运算的时候,会有具体的类型进行替换。占为类型可以作为参数,也可以作为返回值。当然也可以定义多个,例如<T1,T2>

注意:Swift是类型安全的语言,编译器会进行类型检查,如果类型不匹配会报错。

二 类型约束

在泛型定义中,类型约束十分重要。比如,定义一个泛型对一组数据进行排序,那么这组数据一定要能够比较(大于,等于,小于),如若不然,传入一组数据中既有Int,又有String,Int和String进行排序,明显没有一个合理的规则。

泛型的约束表示这种类型必须继承某个类,或者实现某些协议。

语法如下

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // function body goes here
}

然后,实现一个使用类型约束来定义泛型的例子。

f?????unc findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {
    for (index, value) in enumerate(array) {
            if value == valueToFind {
                return index
            }
    }
    return nil
}

这里,通过泛型来定义一个在数组中查找指定数据的函数,明显这个类型T要支持==运算符。Equatable就是系统提供的一种协议,遵循这种协议的类型都可以使用==运算符。

三 关联类型

在二中,我们使用了系统提供的Equatable,那么如何自定义类似的协议呢?

使用关联类型,语法是在协议中使用typealise关键字来定义关联类型。

举例

protocol Container {
typealias ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}

这里,定义一种关联类型,ItemType,对于协议来说,任何遵循这个协议的结构体必须实现两个方法(append,count)一个下标脚本。而ItemType的具体类型由遵循协议的类来决定。例如

struct IntStack: Container {
// IntStack

四 Where语句

Where语句对关联类型进行了更进一步的约束。一个where语句可以让一个关联类型遵循某个特定的协议,也可以让特定的数据类型和关联类型的数据类型一致。

func allItemsMatch<
        C1: Container, C2: Container
        where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> (someContainer: C1, anotherContainer: C2) -> Bool {
        if someContainer.count != anotherContainer.count {
            return false
        }
        for i in 0..<someContainer.count {
            if someContainer[i] != anotherContainer[i] {
                return false
            }
        }
        return true
}

这里定义了四个约束

1.C1必须遵循Container协议

2.C2必须遵循Container协议

3.C1和C2的ItemType一致

4.C1的ItemType遵循Equatable协议

时间: 2024-10-08 05:52:26

Swift入门教程19-泛型的相关文章

Swift入门教程:基本语法大全

原文:Swift入门教程:基本语法大全       简介:                                                                                                                                                                                  什么是Swift                                  

Swift入门教程:基本语法(三)

打印输出 Swift提供了2个打印输出函数 println :输出内容后会自动换行 print :对比println,少了个自动换行的功能 示例 输出字符串 println("欢迎学习传智播客iOS学院Swift教程") var name = "传智播客iOS学院\n" print(name) 输出其他数据类型 var age = 7 println(age) println("我今年\(age)岁") 元组类型 什么元组类型 元组类型由 N个

Swift入门教程:基本语法(二)

数字格式 数字可以增加额外的格式,使它们更容易阅读 可以增加额外的零 0 let money = 001999           // 1999 let money2 = 001999.000   // 1999.0 可以增加额外的下划线 _ ,以增强可读性 let oneMillion1 = 1_000_000    // 1000000 let oneMillion2 = 100_0000      // 1000000 let overOneMillion = 1_000_000.000

Swift入门教程:基本语法(一)

      简介:                                                                                       什么是Swift Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为"雨燕",右上角的图标就是它的LOGO 跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造 Swift的语法特点

swift入门教程系列7-控制流

控制流 总的来说使用方式和C,C++,Objective C等差不多 这里讲解可能会少一点,大家实际写点代码就会用了,很简单,可以侧重看看switch,swift中的swift功能更多一些 有一点特别要注意的是,swift中的条件表达式的结果一定是Bool类型的 也就是说 var a  = 19 if a{ } 这样的表达式是不对的,因为a是Int类型 1.if 常用的if也就三种 if bool{ } if bool{ } else{ } if bool{ } else if{ } else{

Swift入门教程18-代理Delegate

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc 一 代理的理解 何为代理?顾名思义,代理就是把自己做的任务交给别人做.让代理遵循着监听到一些事件,实现一些数据源.做过IOS开发的都应该知道TableView有两个属性,delegate和dataSource.这就是代理最好的体现,tableView在设计之初并不知道这个tableView将来会放在哪里,存储的是什么东西,这里数据源就起到了关键性作用:对于设计者来说,我只要依据数据源来生成对应的视图,对于

Swift入门教程17-ARC与强弱引用

ARC 全称自动引用计数,是一种内存管理机制.当一块内存的强引用的数目等于0的时候,则这块内存将会被释放. 由于在Swift中,枚举和结构体都是值类型,不通过引用方式进行存储和传递,所以Swift中只有类的实例会进行自动引用计数. 规则:在创建的初始,类的实例的引用计数为1,没增加一次强引用,引用计数加1,每个强引用为nil后,引用计数减1.弱引用不会增加引用计数,关键词weak 注意,不能访问已经被释放了的内存,这样会造成程序崩溃. 一.强弱引用 用下图表示会直观一些 一个强引用,一个弱引用.

Swift入门教程:基本运算符

基本运算符 Swift所支持的基本运算符 赋值运算符:= 复合赋值运算符:+=.-= 算数运算符:+.-.*./ 求余运算符:% 自增.自减运算符:++.-- 比较运算符:==.!=.>.<.>=.<= 逻辑运算符:&&.||.! 三目运算符:? : 范围运算符:.. .... 赋值运算符 单对单赋值 var a = 5 let b = 20 多对多赋值 var (x, y) = (1, 2) // x的值是1,y的值是2 跟C\OC不一样的是:Swift的赋值运算

Swift入门教程3-字符串String

原创blog,转载请注明出处 String 在swfit中,String兼容Unicode的方式.使用方法和C语言类似. 注意 在Cocoa和Cocoa touch中,Swift的String,和Foundation中的NSString是兼容的,所有NSString额API都可以调用String类型 字符串常量 1.含转义字符:例如\n,\t等 2.单字节Unicode标量,\xmm 3.双字节Unicode标量,\ummmm 4.四字节Unicode标量,\Ummmmmmmm 这里的m为十六进