从 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;
}
};
我在使用 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;
}
};