扩展,协议

扩展

扩展类似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)

你可能感兴趣的:(扩展,协议)