swift中的 扩展,协议和代理

extensions

  1. 用于扩展现有的数据结构。你可以添加方法/属性 到 一个 类/结构体/枚举 (即便你没有源码)

比如说,这个方法为UIViewController 添加了一个方法 contentViewController

extension UIViewController {
    var contentViewController:UIViewController {
        if let navigtation = self as? UINavigationController {
            return navigtation.visibleViewController
        } else {
            return self
        }
    }
}
  1. 有一些限制需要注意
    1. 只能添加新的属性和方法,你不能重写已经存在的属性和方法
    2. 只能添加计算属性,不能添加存储属性

Protocols

  1. 协议是一种更精确的表示API的方式

一个API可以让调用者传递调用者想要传递的任何 类/结构体/枚举(可以要求他们实现API想要的特定的方法或属性。) 而不是强制调用者传递制定的 类,结构体或枚举。

协议仅仅就是一些方法和属性声明的集合。

  1. 协议是一个类型

    它可以像其他类型一样,用在几乎任何地方:变声声明,函数参数等等。

  2. 实现协议方法和属性

    协议的实现是由诸如类,架构体或枚举等实现类型来提供的,因此,协议可以拥有与之相关的非存储对象。协议中的任何存储对象都需要由实现类型来实现。

    通过扩展向协议中添加方法也是可以的,但是要记住,扩展不能使用存储属性。

协议的使用有三个方面:

  1. 协议声明 (协议中有哪些属性和方法)
  2. 类,结构体或枚举,声明实现了这个协议
  3. 类,结构体或枚举 实现协议

协议中的可选实现方法

通常任何协议的实现者都必须要实现协议中所有的方法和属性,然而是可以把某些方法标记为可选实现的。

任何方法想要可选实现,都必须标记为 @objc

任何可选协议的实现者都必须继承自 NSObject

协议声明:

protocol SomeProtocol:InheritedProtocol1,InheritedProtocol2{
    var someProperty:Int{get set}
    func aMethod(arg1:Double,anotherArgument:String)->SomeType
    mutating func changIt()
    init(arg:Type)
}

任何实现SomeProtocol协议的必须同时实现InheritedProtocol1和InheritedProtocol2。

必须要指定属性是只读的还是可读可写的

任何希望修改接受者的方法都需要标记为 mutating(除非你使用class关键词限制制你的协议只能由类来实现)

你甚至可以指定实现者必须提供一个指定的初始化方法。

枚举和结构体没有父类,一些协议可以由给定的类,结构体或枚举实现。在类中,inits方法必须被标记为required 或者不遵守协议。

delegation

使用协议非常重要和简单。

  1. 一个视图声明一个协议
  2. 这个View的API有一个弱代理引用
  3. 这个视图使用代理做一些事情
  4. 控制器声明遵守了协议
  5. 控制器把自己声明为代理
  6. 控制器实现代理方法

你可能感兴趣的:(swift中的 扩展,协议和代理)