从 Objective-c 调用 swift 闭包

Calling swift closure from Objective-c

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

这是 swift 声明:

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

如何将处理程序从 objective-c 传递到 return 一个 NSColor?

根据F*ck*ngBlockSyntax,我们这样写一个块作为var:

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

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

我用

测试过
@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;
    }
};