从 Objective-c 调用 swift closure

Calling swift closure from Objective-c

提问人:Pat_Morita 提问时间:11/13/2020 更新时间:11/14/2020 访问量:2939

问:

我在 macOS 上,objective-c。我包含了一个 Swift 5 框架,我不知道的一件事是如何提供闭包。

这是迅速的声明:

var cancelledStateColorHandler: ((NSColor) -> NSColor)?

如何从 objective-c 传递处理程序以返回 NSColor?

闭包 Objective-C-Swift-Bridge

评论

1赞 Larme 11/13/2020
在 Objective-C 中,它们被称为 .fuckingblocksyntax.com stackoverflow.com/questions/42647453/...等等。block
0赞 Pat_Morita 11/13/2020
我知道那件事。问题是如何将它们从 objective-c 传递给上面的 SWIFT 声明变量
1赞 Larme 11/13/2020
yourInstance.cancelledStateColorHandler = ^NSColor * _Nonnull(NSColor * _Nonnull input) { if ([input isEqual:[UIColor whiteColor]]) { return [NSColor redColor]; } else { return NSColor.redColor; } };?我不明白你的问题。
0赞 Pat_Morita 11/13/2020
解决了它 - 我只是不知道正确的语法,请让它成为一个答案,以便我可以接受它(为了正确起见,将 UIColor 更改为 NSColor)

答:

1赞 Larme 11/14/2020 #1

根据 F*ck*ngBlockSyntax,我们以这种方式将块写成 var:

returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...};

var cancelledStateColorHandler: ((NSColor) -> NSColor)?将翻译成 swift 为 . 要模拟它,请检查您的 Project-Swift.h 文件。@property (nonatomic, copy) NSColor * _Nonnull (^ _Nullable cancelledStateColorHandler)(NSColor * _Nonnull);

我测试了

@objc class TestClass: NSObject {
    @objc
    var cancelledStateColorHandler: ((NSColor) -> NSColor)?
}

并得到:

SWIFT_CLASS("_TtC10ProjectName9TestClass")
@interface TestClass : NSObject
@property (nonatomic, copy) NSColor * _Nonnull (^ _Nullable cancelledStateColorHandler)(NSColor * _Nonnull);
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

现在,我们只关注语法的第二部分,因为左边的部分是yourInstance.cancelledStateColorHandler

^returnType         (parameters              ) {...};
^NSColor * _Nonnull (NSColor * _Nonnull input) {...};

所以我们得到了:

yourInstance.cancelledStateColorHandler = ^NSColor * _Nonnull(NSColor * _Nonnull input) { 
    //Here that's sample code to show that we can use the input param, and that we need to return a value too.
    if ([input isEqual:[NSColor whiteColor]]) 
    { 
        return [NSColor redColor]; 
    } 
    else 
    { 
        return NSColor.redColor;
    }
};