-
泛型:
泛型代码让你能够根据自定义的需求,编写出适用于任意类型、灵活可重用的函数及类型。它能让你避免代码的重复,用一种清晰和抽象的方式来表达代码的意图。
- ####泛型参数:
Swift函数中,我们确定传入参数的时候,必须要确定参数的类型.
如下例子,我们定义了一个方法,调换传入的两个Int
类型值.当我们想要调换两个字符串的值,又得重新写一个传入类型为String
的方法.
这时,如果我们使用"泛型",将会省去很多不必要的重复代码.
- #####写法:
在方法名后添加<xxx>
,把具体的参数类型替换成xxx
,xxx
泛指任意类型,决定于你传入的参数,需要注意,多个参数情况下,必须保持参数类型一致.xxx
的类型由你自己决定,可以为T
,U
,也可以是任意你想定义的名称
//转换两个Int值 func swapTwoInt(_ a : inout Int,_ b : inout Int) { let temp = a; a = b b = temp } var a = 3 ,b = 4 swapTwoInt(&a, &b) print(a,b) //转换两个传入String的值 func swapTwoString(_ a : inout String,_ b : inout String) { let temp = a; a = b b = temp } var c = "c" , d = "d" //转换两个任意值 swapTwoString(&c, &d) print(c,d) func swapTwoValues<A>(_ a:inout A , _ b :inout A) { let temp = a; a = b b = temp } swapTwoValues(&a, &b) swapTwoValues(&c, &d) print(a,b) print(c,d) //报错,两个参数类型必须一致 //swapTwoValues(&a, &c)
- ####泛型类型
- ####扩展泛型类型
class SomeClass<SOMETYPE> { var item : [SOMETYPE] init(item:[SOMETYPE]) { self.item = item } } var string = SomeClass(item: ["a"]) var int = SomeClass(item: [1]) extension SomeClass { var topItem:SOMETYPE? { return item.isEmpty ? nil:item[item.count-1] } } int.topItem
- ####类型约束:
类型约束可以指定一个类型参数必须继承自指定类,或者符合一个特定的协议或协议组合。
- ######写法:
在定义泛型类型或泛型参数时,<A:xxx>
,在自定类型名称后添加":xxx",xxx为协议或者类型
```
class SomeClass{
}
func compareTwoValues<T:Equatable>(a:T,_ b:T) {
if a == b {
print("\(a)=\(b)")
}else {
print("\(a)!=\(b)")
}
}
compareTwoValues(1, "a")
//报错,因为someclass不符合Equatable协议
//compareTwoValues("a", SomeClass())
```
- ####类型关联:
关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。
- ######写法:使用"associatedtype"关键字修饰占位名
protocol SomeProtocol { associatedtype SomeType var getValue:SomeType{get} } class SomeClass<T>: SomeProtocol { var someValue:T init (somevalue:T) { self.someValue = somevalue } var getValue: T { return someValue } } var someclass = SomeClass(somevalue: 1) someclass.getValue
网友评论