我有一些Objective-c代码,我想在swift中做同样的事情:
dispatch_block_t adjustTooltipVisibility = ^{
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0;
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0;
};
到目前为止,我发现dispatch_block_t
的所有内容都是它在swift中用作dispatch_after作为闭包。所以我可以理解,但是我不能理解它在objective-c中的使用,以及如何将这些代码转换为快速代码
答案 0 :(得分:5)
dispatch_block_t
是Void -> Void
闭包的类型别名。 Swift(从版本1.2开始)并不能很好地推断出这些,所以你需要声明类型。您还需要明确引用self
以访问实例属性,并希望确保您不创建引用周期。在闭包中将self
声明为weak
是一种安全的方法:
let adjustTooltipVisibility: dispatch_block_t = { [weak self] in
if self?._tooltipVisible == true {
self?.tooltipView.alpha = 1
self?.tooltipTipView.alpha = 1
} else {
self?.tooltipView.alpha = 0
self?.tooltipTipView.alpha = 0
}
}
答案 1 :(得分:1)
let adjustTooltipVisibility:Void->Void = {
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};
如果会有某些事情导致保留周期,你应该使用无主捕获来自我。 块的类型是Void-> Void
答案 2 :(得分:0)
在Swift 5中,
dispatch_block_t
是()->Void
let adjustTooltipVisibility: ()->Void = {
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};
答案 3 :(得分:0)
我写了2个版本的objective-c和swift5你可以比较
Objective-C 版本
dispatch_block_t completionBlock = ^{
// run your code in completion block
}
// start task in background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {
// update completion block in main thread
dispatch_async(dispatch_get_main_queue(),completionBlock);
};
Swift 5 版本
let completionBlock: () -> Void = {[weak self] in
// run your code in completion block
// using `[weak self] in` to avoid memory leak
}
// start task in background thread
DispatchQueue.global().async {[weak self] in
// update completion block in main thread
DispatchQueue.main.async(execute: completionBlock)
}