在 Objective-C 和 Swift 中,编写不返回任何内容且不接受任何参数的闭包的有效方法是什么?

What are all valid ways of writing closures that return nothing and accept no parameters in Objective-C and Swift?

提问人:ayfer 提问时间:10/31/2020 最后编辑:zeytinayfer 更新时间:1/1/2021 访问量:220

问:

我在理解 Swift 和 Objective-C 中的闭包语法时遇到困难。

有人可以告诉我用两种语言编写一个不接受参数且不返回任何内容的闭包的所有可能方法吗?

iOS Objective-C Swift SwiftUI 关闭

评论

6赞 Duncan C 10/31/2020
实际上,不存在不带参数且不返回值的闭包/块的可能性。正好有一个。请参阅 zeytin 的回答,了解此类闭包/块的 Swift 和 Objective-C 语法。
0赞 Rob 10/31/2020
仅供参考,它们在 Objective-C 中称为,在 Swift 中称为闭包
1赞 Rob 10/31/2020
仅供参考,这是在 Objective-C 中的各种上下文中使用块的备忘单:goshdarnblocksyntax.com
1赞 ayfer 10/31/2020
感谢所有链接和评论

答:

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 块和函数指针之间的等价性。