美文网首页
扩展,协议

扩展,协议

作者: merlinCry | 来源:发表于2018-07-24 09:01 被阅读0次

扩展

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

相关文章

  • swift 4.0 协议 协议扩展

    协议 协议扩展

  • swift 扩展和协议的结合

    协议和扩展是可以结合使用的,可以通过扩展使已有的类型采纳某个协议,也可以对现有协议进行扩展。 一、通过扩展采纳协议...

  • POP-面向协议编程

    什么是面向协议编程? 面向协议 = 协议 + 扩展 + 继承通过协议、扩展做功能划分,降低模块间的耦合,增强代码的...

  • swift中protocol的extension中使用#sele

    协议扩展 不能在上面这样的协议扩展中直接使用#selector,协议扩展对于OC是看不见的。 其中有个报错: @o...

  • Swift 命名空间形式扩展的理解和问题探讨

    先从 Swift 协议扩展的语法说起 注:协议扩展 Protocol extension: Swift 1.x 中...

  • 扩展,协议

    扩展 扩展类似oc里面的category,用来为已存在的类提供额外功能。 extension可以访问类的所有成员,...

  • 协议扩展

    协议扩展 在Swift 1.0 时代,协议(Protocol)基本上类似一个接口,定义若干属性和方法,供类、结构体...

  • 协议扩展

    extension 扩展为现有的类、结构体、枚举类型、协议添加了新功能。这也包括了为无访问权限的源代码扩展类型的能...

  • Swift 语言简单介绍(二)

    本片文字主要介绍: 结构体 类 协议 扩展 闭包 结构体 类 协议 扩展 枚举 闭包

  • swift 协议的可选方法

    在协议中定义方法 扩展协议,在扩展协议中给出默认实现 如果代理实现了此方法,会覆盖默认实现 public prot...

网友评论

      本文标题:扩展,协议

      本文链接:https://www.haomeiwen.com/subject/nadjmftx.html