扩展语法、计算型属性、构造器、方法、下标、嵌套类型。
扩展就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模)。
Swift中的扩展可以:
1)添加计算型属性和计算型类型属性
2)定义实例方法和类型方法
3)提供新的构造器
4)定义下标
5)定义和使用新的嵌套类型
6)使一个已有类型符合某个协议
在Swift中,甚至可以对协议进行扩展,提供协议要求的实现,或者添加额外的功能,从而可以让符合协议的类型拥有这些功能。
注意:扩展可以为一个类型添加新的功能,但是不能重写已有的功能。
扩展语法:
使用关键字extension来声明扩展:
extension SomeType{
//为SomeType添加的新功能写到这里
}
可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议。在这种情况下,无论是类还是结构体,协议名字的书写方式完全一样:
extension SomeType:SomeProtocol, AnotherProtocol{
//协议实现
}
注意:如果通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的。
计算型属性:
扩展可以为已有类型添加计算型实例属性和计算型类型属性。
extension Double{
var km:Double{return self*1_000.0}
var m:Double{return self}
var cm:Double{return self/100.0}
var mm:Double{return self/1_000.0}
}
这些计算型属性表达的含义是把一个Double值看作是某单位下的长度值。即使它们被实现为计算型属性,但这些属性的名字仍可紧接一个浮点型字面值,从而通过点语法来使用,并以此实现距离转换。
注意:扩展可以添加新的计算型属性,但是不可以添加存储型属性,也不可以为已有属性添加属性观察器。
构造器:
扩展可以为已有类型添加新的构造器。可以扩展其它类型,将自己定制类型作为其构造器参数,或者提供该类型的原始实现中未提供的额外初始化选项。
扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。
注意:如果使用扩展为一个值类型添加构造器,同时该值类型的原始实现中未定义任何定制的构造器且所有存储属性提供了默认值,那么我们就可以在扩展中的构造器里调用默认构造器和逐一成员构造器。
如果把定制的构造器写在值类型的原始实现中,上述规则将不再适用。
即如果类型的原始实现中有构造器,则不能在扩展中调用该值类型的默认构造器或逐一成员构造器,因为它们不会被编译器自动实现。如果值类型没有定义任何构造器,则扩展中可用默认构造器或逐一构造器。
扩展中实现的新构造器,必须确保类型的所有属性在构造过程中初始化。
方法:
扩展可以为已有类型添加新的实例方法和类型方法。
extension Int{
func repetitions(task:() -> Void){
for _ in 0..<self{
task()
}
}
}
3.repetitions({
print("hello")
}) //将闭包作为实参传递
可变实例方法:
通过扩展添加的实例方法也可以修改该实例本身。结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的可变方法一样。
extension Int{
mutating func square(){
self=self*self
}
}
下标:
扩展可以为已有类型添加新下标。
extension Int{
subscript(digitIndex:Int)->Int{
var decimalBase=1
for _ in 0..<digitIndex{
decimalBase*=10
}
return (self/decimalBase) % 10
}
}
//将Int变为可通过下标访问的类型
print(1234[0]) //打印4
print(1234[1]) //打印3
嵌套类型:
扩展可以为已有的类、结构体和枚举添加新的嵌套类型:
extension Int{
enum Kind{
case Negative, Zero, Positive
}
var kind:Kind{
switch self{
case 0:
return .Zero
case let x where x > 0:
return .Positive
default:
return .Negative
}
}
}
//为Int类型添加一个嵌套的Kind类型,添加一个只读计算型属性kind来获得实例的Kind类型
print(10.kind) //打印Positive
print((-9).kind) //打印Negative