扩展
扩展类似oc里面的category,用来为已存在的类提供额外功能。
extension可以访问类的所有成员,包括私有.
swift的扩展可以添加的有:
• 添加计算实例属性 和计算类属性
• 定义实例方法和类型方法
• 提供新的构造器
• 定义下标
• 定义和使用新的嵌套类型
• 使一个已有类型符合某个协议
//添加功能
extension SomeType {
// 为 SomeType 添加的新功能写到这里
}
//实现协议
extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这里
}
协议
和oc中的协议是一个意思,就是一个蓝图。但是swift的协议可定义的东西和oc不一样。
1.属性要求
swift的协议是可以定义属性的。
即:要求遵循协议的类提供特定名称,特定类型的实例属性或类属性。协议不指定属性是存储型属性还是计算型属性,它只指定属性的名称和类型。此外,协议还指定属性是可读的还是可读可写的。
protocol SomeProtocol {
//只能用var声明,get表示可读,set表示可写
var mustBeSettable: Int { get set }
var doesNotNeedToBeSettable: Int { get }
}
2.方法要求
不用写方法实现,只定义即可。不支持参数默认值。类方法的话只能用static关键字。
protocol RandomNumberGenerator {
func random() -> Double
}
3.构造器要求
swift的协议可以定义构造器。实现的时候要求在前面加上required关键字,也就是说协议中定义的构造器都是必要构造器,子类必须提供实现。
//定义
protocol SomeProtocol {
init(someParameter: Int)
}
//实现
class SomeClass: SomeProtocol {
required init(someParameter: Int) {
// 这里是构造器的实现部分
}
}
//子类实现
class SomeSubClass: SomeSuperClass, SomeProtocol {
//override
required override init() {
// initializer implementation goes here
}
}
协议是一种类型,可以作为属性的类型方法的参数和返回值类型。
4.协议可以继承其他协议,并且可以被extension扩展。
5.类类型专属协议
可以添加class关键字指定给协议只能被类类型遵循
protocol Animal: class {
func speak()
}
6.协议合成
用 & 来合成两个协议
当一个函数的参数既要遵循协议A又要遵循协议B的时候使用。
protocol Named {
var name: String { get }
}
protocol Aged {
var age: Int { get }
}
struct Person: Named, Aged {
var name: String
var age: Int
}
func wishHappyBirthday(to celebrator: Named & Aged) {
print("Happy birthday, \(celebrator.name), you're \(celebrator.age)!")
}
//这个参数同事需要满足两个协议
let birthdayPerson = Person(name: "Malcolm", age: 21)
wishHappyBirthday(to: birthdayPerson)
网友评论