delegate

iOS 中的 Delegate 设计模式

落爺英雄遲暮 提交于 2020-02-05 12:46:39
最近写的 iOS/Swift 代码比较多,很久没动笔又没怎么写过技术类的文章。所以决定从小小的总结一下 Delegate 模式开始写一写,因此这也是一篇入门文章。 What is Delegate ? 我想很多同学第一次遇见 Delegate 这个词是在写 tableView 的时候。那时候我也只是每每需要用的时候就照着这种模式写上 tableView.delegate = self, tableView.dataSource = self 也并不理解究竟是什么意思。 应该说 delegate 是 Cocoa/CocoaTouch 中的一种设计模式,正如前面提到的 tableView 一样,Cocoa 框架中很多地方都用到了这种设计模式。这种设计模式中我们可以将一个对象的一些功能委托给另一个对象来实现。因此使用 delegate 模式可以帮助我们设计出更松耦合的代码。 delegate 使用起来非常简单。假设我们现在需要一个电视机和一个音响,我们想要将电视机播放声音的职责委托给外置的音响来实现,我们就可以这样编写: 12345678910111213141516171819202122232425262728 // 首先定义一个 Protocol 协议protocol PlayAudioDelegate { func playAudio()}// 编写一个遵循

C# Delegate 委托

╄→гoц情女王★ 提交于 2020-02-05 07:39:16
https://www.runoob.com/csharp/csharp-delegate.html 1、 解释: (1) 委托(Delegate)一种引用类型变量,是对某个方法的引用的。可以看做一个“函数包装”, 把函数包装成对象用来传递 。 (2) 类似 指向方法的指针,所以引用的方法可在运行时被改变。 (3) 委托(Delegate)用于实现事件和回调方法。 (4) 所有的委托都派生自 System.Delegate 类。 2、 声明委托类型: 委托类型声明决定了可引用的方法类型。此委托类型的实例可指向一个相同类型的方法。例如: public delegate void printString(string s); // 实例化委托 printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile); 4、 委托的多播: 一个委托可以调用多个方法,这被称为委托的多播(multicasting),也叫组播。 "+" 运算符合并委托。一个委托调用它所合并的多个委托。只有相同类型的委托可被合并。 "-" 运算符可用于从合并的委托中移除组件委托。 来源: CSDN 作者: gubaofu 链接: https://blog.csdn.net/gubaofu

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

…衆ロ難τιáo~ 提交于 2020-02-02 01:09:16
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一 双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get; set; } //老鼠遇到的猫 //老鼠逃跑的方法 public void Run() { Console.WriteLine(MyCat.Name + "猫来了,大家快跑!!我是" + Name); //打印出信息 包含了猫的名字和老鼠本身的名字 } //带参和无参构造 public Rat() { } public Rat(string name, Cat cat) { this.Name = name; this.MyCat = cat; } } 要让猫叫的时候依次打印出老鼠的逃跑方法,需要在Cat类里添加一个存放Rat对象的集合 Cat类的代码如下 public class Cat { public string Name { get; set; } //猫的名字 List<Rat> list

C#图解教程 第十三章 委托

左心房为你撑大大i 提交于 2020-02-02 00:56:40
委托 什么是委托 可以认为委托是持有一个或多个方法的对象。当然,正常情况下你不想“执行”一个对象,但委托与典型对象不同。可以执行委托,这时委托会执行它所“持有”的方法。 我们从下面的示例代码开始。具体细节将在本章剩余内容介绍。 代码开始部分声明了一个委托类型MyDel(没错,是委托类型不是委托对象) Program类声明了3个方法:PrintLow、PrintHigh和Main。接下来要创建的委托对象将持有PrintLow或PrintHigh方法,但具体使用哪个运行时确定 Main声明了局部变量del,持有一个MyDel类型的委托对象的引用。这不会创建对象。只是创建持有委托对象引用的变量,在几行后便会创建委托对象,并将值赋给这个变量 Main创建了Random类的对象,这是个随机数生成器类。接着调用该对象Next方法,将99作为参数。这会返回介于0到99间的随机整数,并将这个值保存在局部变量randomValue中 下面一行检查这个随机值是否小于50 小于50,就创建一个MyDel委托对象并初始化,让它持有PrintLow方法的引用 否则,就创建一个持有PrintHigh方法引用的MyDel委托对象 最后,Main执行委托对象del,这将执行它持有的方法(PrintLow或PrintHigh) 如果你有C++背景,理解委托最快的方法是把它看成一个类型安全的、面向对象的C++函数指针

委托编程指南

ⅰ亾dé卋堺 提交于 2020-02-01 10:57:40
一.什么是委托 委托的本质是一种数据类型,和类类型一样,只是一种数据类型没什么神秘的地方,委托是一种引用数据类型, 表示对具有特定参数列表和返回类型的方法的引用 。在实例化委托时,你可以将其实例与任何兼容的方法(参数和返回值,简称方法的签名)相关联,再通俗一点的讲, 委托是可以将"方法"定义成变量的数据类型 。 二.为什么使用委托 委托用于将方法作为参数传递给其他方法,当某个方法直接调用有困难时,我们就想找一个"中间人"来帮我们调用,这个中间人就是委托。 委托的简单应用的第一个例子:从窗体向主窗体传递值,实现主窗体窗体刷新 主窗体: public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); FrmOther objFrm = new FrmOther(); //将从窗体的委托变量和主窗体的对应方法关联 objFrm.msgSender = this.Receiver; objFrm.Show(); } /// <summary> /// 接收委托传递的信息 /// </summary> /// <param name="counter"></param> private void Receiver(string counter) { this.lblCount.Text =

c#学习笔记03——委托和事件

て烟熏妆下的殇ゞ 提交于 2020-01-31 21:26:30
委托:一种引用类型,这种类型可以用来定义方法签名,从而使用委托实现将方法作为参数传递给其他方法。类似于C++中的函数之争,使用委托使程序员可以 将方法引用封装在委托对象内 。 定义和声明委托: 1 delegate 返回值 委托名(参数列表); 2 eg: 3 public delegate void SayHelloDelegate(string name); 使用委托:委托其实通过返回值和参数列表来定义方法和签名。任何与委托具有相同返回值和参数列表(签名)的方法都可以赋给该委托。 1 public delegate void SayHelloDelegate(string name);//声明委托 2 public viod SayHelloEnglish(string name)//声明方法 3 { 4 Console.WriteLine("Hello,{0}",name); 5 } 6 SayHelloDelegate s=SayHelloEnglish;//把方法赋予委托对象 View Code 委托实例化的几种形式: 1 1.使用new关键字 2 SayHelloDelegate s=new SayHelloDelegate(SayHelloEnglish); 3 2.直接赋值 4 SayHelloDelegate s=SayHelloEnglish; 5 3

【原】AFNetworking源码阅读(三)

爱⌒轻易说出口 提交于 2020-01-30 09:55:22
【原】AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇 的话,主要是讲了如何通过构建一个request来生成一个data task。但是对于NSURLSession部分却没有提及。主要是精力有限,准备在这一部分把NSURLSession的知识好好梳理一遍。一切先从上一篇中的addDelegateForDataTask:函数说起,然后再介绍AFURLSessionManagerTaskDelegate,最后结合AFURLSessionManager中的NSURLSession梳理一遍(可能会将部分内容放到下一篇)。 2. 由addDelegateForDataTask引发 注意addDelegateForDataTask:这个函数并不是AFURLSessionManagerTaskDelegate的函数,而是AFURLSessionManager的一个函数。这也侧面说明了 AFURLSessionManagerTaskDelegate和NSURLSessionTask的关系是由 AFURLSessionManager管理的 。 该函数除了对于AFURLSessionManagerTaskDelegate类型的成员变量delegate设置之外,最关键的代码就是 [self setDelegate:delegate

微信小程序中使用 async 和 await

北城余情 提交于 2020-01-29 01:28:54
在⼩程序的开发⼯具中,勾选 es6转es5语法 下载 facebook的regenerator库中的 regenerator/packages/regenerator-runtime/runtime.js 在⼩程序⽬录下新建⽂件夹 lib/runtime/runtime.js ,将代码拷⻉进去 在每⼀个需要使⽤async语法的⻚⾯js⽂件中,都引⼊(不能全局引⼊) 引入方式 : import regeneratorRuntime from '…/…/lib/runtime/runtime’ runtime.js 文件中需要拷贝的代码如下:(或者自己到github上去拷贝也可以,github连接地址在第二步上已给出) /** Copyright © 2014-present, Facebook, Inc. This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. */ var regeneratorRuntime = (function (exports) { “use strict”; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty;

unity 委托delegate的理解

扶醉桌前 提交于 2020-01-27 05:27:54
unity中的委托类似于c/c++中的函数指针 直接上代码 public class delegateTest : MonoBehaviour { // Start is called before the first frame update void Start() { //用法1 GoodMorning(GoodMorningChinese); //用法2 m = GoodMorningEnglish; m(); //用法3 匿名委托 GoodMorning(delegate { Debug.Log("aaaaa"); }); } delegate void MorningLanguage();//声明一个委托 (类似函数指针,指向参数为空,返回值为void的函数) MorningLanguage m; //实例化一个委托的对象 void GoodMorning(MorningLanguage ml)// { ml();//参数是空的 } void GoodMorningChinese()//某一个参数为空,返回值为void的函数 { Debug.Log("早上好"); } void GoodMorningEnglish() { Debug.Log("good morning"); } } 来源: CSDN 作者: Murphy402 链接: https://blog

Func<(Of <(T, TResult>)>) 委托

自古美人都是妖i 提交于 2020-01-26 15:00:42
Code 命名空间: System 程序集: System.Core(在 System.Core.dll 中) 语法 Visual Basic(声明) Public Delegate Function Func(Of T, TResult) ( _ arg As T _ ) As TResult Visual Basic (用法) Dim instance As New Func(Of T, TResult)(AddressOf HandlerMethod) C# public delegate TResult Func < T, TResult > ( T arg ) Visual C ++ generic < typename T, typename TResult > public delegate TResult Func( T arg ) J# J# 支持使用泛型 API,但是不支持新泛型 API 的声明。 JScript JScript 不支持泛型类型或方法。 类型参数 T 此委托封装的方法的参数类型。 TResult 此委托封装的方法的返回值类型。 参数 arg 类型:T 此委托封装的方法的参数。 返回值 类型:TResult 此委托封装的方法的返回值。 备注 可以使用此委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托