提问人:ayfer 提问时间:10/31/2020 最后编辑:zeytinayfer 更新时间:1/1/2021 访问量:220
在 Objective-C 和 Swift 中,编写不返回任何内容且不接受任何参数的闭包的有效方法是什么?
What are all valid ways of writing closures that return nothing and accept no parameters in Objective-C and Swift?
问:
我在理解 Swift 和 Objective-C 中的闭包语法时遇到困难。
有人可以告诉我用两种语言编写一个不接受参数且不返回任何内容的闭包的所有可能方法吗?
答:
7赞
zeytin
10/31/2020
#1
在 Objective-C 语言中
void (^closureA)(void) = ^{ };
在 Swift 语言中
let closureB: () -> ()
let closureC: () -> Void
5赞
skaak
10/31/2020
#2
由于您要求所有参数,并且由于 C 在 Objective-C 的范围内,并且由于您没有指定任何参数,因此这也可以完成工作。
void ( * f ) ( void ); // C function pointer
以上纯粹是学术性的,下面是为了娱乐,但有了它,你可以做到以下几点!
// Void block to void function pointer
void ( ^ block ) ( void ) = ^ {
NSLog ( @"You have been warned" );
};
void * p = & block;
long * q = ( long * )( * ( long * ) p );
long * r = q + 2; // Try 0, 1, 2 [crash crash voila!]
void ( * f ) ( void ) = ( void ( * )( void ) )( * r );
// You have been warned
f ();
这是非常危险的(和有趣的),但确实说明了 void 块和函数指针之间的等价性。
评论