C#委托
是指向方法的类型。
委托声明
在无方法体的方法前添加关键字delegate。
delegate int del(int x, int y);
委托调用
用方法名称实例化委托,赋值给一个委托类型的变量,然后将变量当作全局方法调用。
del obj = new del(delFunc);
Console.WriteLine(obj(10, 10)); // print 100
Swift委托
一般指向协议的变量或常量。
委托声明
protocol DiceGameDelegate {
func game()
}
class Game {
var delegate: DiceGameDelegate?
fun play(){
delegate?.game()
}
}
class DiceGameTracker: DiceGameDelegate {
func game() {
println("game play")
}
}
委托调用
直接调用协议的属性和方法。
let tracker = DiceGameTracker()
let game = Game()
game.delegate = tracker
game.play() // print game play
C# Lambda表达式
用于创建委托类型的匿名函数
delegate int del(int x, int y);
void calc(del obj)
{
Console.WriteLine(obj(10, 10));
}
static void Main(string[] args)
{
// 调用方法,传递参数为Lambda表达式
calc((x, y) => { return x * y; });
// print 100
}
仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔:
(x, y) => x * y
有时,编译器难以或无法推断输入类型。 如果出现这种情况,你可以按以下示例中所示方式显式指定类型:
(int x, int y) => x * y
使用空括号指定零个输入参数:
() => Console.WriteLine("void");
Swift 闭包
函数代码块,可以在代码中被传递和使用
func calc(closure:(Int, Int) -> Int){
println(closure(10,10))
}
// 调用方法,传递参数为闭包
calc({
(x, y) -> Int in return x * y
})
// print 100
有时,编译器难以或无法推断输入类型。 如果出现这种情况,你可以按以下示例中所示方式显式指定类型:
(Int x, Int y) -> Int in x * y
使用空括号指定零个输入参数,使用Void表示无返回值:
() -> Void in println("void")