iOS 代理模式Demo,Objc 与 Swift 均有举例
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
Objc代理
Swift代理
.gittognore
README.md

README.md

iOS-Delegate_Demo

Xcode 8.2 | Swift 3.0

在iOS开发中,Delegate 有着具足轻重的位置,如TabelViewDelegateTableViewDataSource

Objective-C 代理模式

在介绍 Swift 代理模式前,先来看一下 Objective-C 中的代理模式如何实现

Objective-C 中用代理实现反向传值:

委托方(子控制器)

委托方需要实现

  • 创建协议 、声明协议方法

      @protocol SubViewDelegate <NSObject>
      
      - (void)backWithStr:(NSString *) str;
    
      @end
    
  • 创建一个代理属性

      // weak声明
      @property (nonatomic, weak) id<SubViewDelegate> delegate;
    
  • 执行协议方法

      // 判断代理是实现该方法,避免carsh
      if ([self.delegate respondsToSelector:@selector(backWithStr:)]) {
       	[self.delegate backWithStr:self.textField.text];
       }
    

代理方(主控制器)

代理方需要实现

  • 遵守(继承)协议

      @interface ViewController () <SubViewDelegate>
    
  • 将代理设为自己

      subVC.delegate = self;
    
  • 实现代理方法

      - (void)backWithStr:(NSString *)str {
      	self.label.text = str;
      }
    

Swift 代理模式

Swift 代理模式 与 Objective-C 一样,只是语法不同。

Swift 中用代理实现反向传值:

委托方(子控制器)

  • 创建协议 、声明协议方法

      protocol SubViewDelegate {
      func backStr(str: String)
      }	
    
  • 创建一个代理属性

      var delegate: SubViewDelegate?
    
  • 执行协议方法

      /// 执行代理方法,将值回传
      delegate?.backStr(str: textField.text ?? "")
    

代理方(主控制器)

  • 继承协议

      class ViewController: UIViewController, SubViewDelegate
    
  • 将代理设为自己

      subVC.delegate = self
    
  • 实现代理方法

     func backStr(str: String) {
         self.textF.text = str
     }

总结

对比可以方法 Swift 代理模式 与 Objective-C 用法完全相同,只是语法发生了变化。

值得一提的是Swift 的扩展 extension可以用来继承协议,实现代码隔离,便于维护。

/// 使用扩展继承协议 实现协议方法 可以分离代码
extension ViewController: SubViewDelegate{
    /// 实现代理方法
    func backStr(str: String) {
        self.textF.text = str
    }
}

结语

如果对你有帮助的话, Star一下吧!