提问人:Pat_Morita 提问时间:11/13/2020 更新时间:11/14/2020 访问量:2939
从 Objective-c 调用 swift closure
Calling swift closure from Objective-c
问:
我在 macOS 上,objective-c。我包含了一个 Swift 5 框架,我不知道的一件事是如何提供闭包。
这是迅速的声明:
var cancelledStateColorHandler: ((NSColor) -> NSColor)?
如何从 objective-c 传递处理程序以返回 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;
}
};
评论
block
yourInstance.cancelledStateColorHandler = ^NSColor * _Nonnull(NSColor * _Nonnull input) { if ([input isEqual:[UIColor whiteColor]]) { return [NSColor redColor]; } else { return NSColor.redColor; } };
?我不明白你的问题。