gpt4 book ai didi

objective-c - 创建结构时的内联 block

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:10 27 4
gpt4 key购买 nike

这是为了学习 =)我知道函数、方法和 block 都可以声明然后调用。我只是想更好地理解 block 。

这是我想做的事情的基本想法。

CGRectMake(100,^CGFloat(){return 1.0f;},100,100);

编译器看不到 block 的返回值,而是将 block 本身视为导致错误的值。我尝试了几种类型转换方 block 的方法,但无法找到解决方案。

有没有办法做到这一点,如果有的话怎么做?如果没有,是否有另一种方法来执行具有返回值的内联函数?

编辑这是我根据第一个示例的正确答案使用的代码示例。

valueLabelMin.frame = CGRectMake(0,
^CGFloat(){
if (CGRectGetMaxY(dateRangeStartLabel.frame)) {
return CGRectGetMaxY(dateRangeStartLabel.frame)-20;
}else{
return self.bounds.size.height-20;
}
}(),
50,
20);

编辑 2 这有点偏离原始问题的上下文,但在阅读问题时我总是很欣赏的上下文中证明了它的相关性。

此示例代码根据条件更改某些 UILabel 的框架,可选择动画并执行完成 block 。

请注意,每个标签 setFrame 仅调用一次,从而产生非常易于管理的代码 =D不用说,“之前”的版本太乱了,我无法让自己包含它。

- (void)updateValueRangeLabels:(BOOL)animated completion:(void(^)(void))completion {

void (^setLabelFrames)() = ^()
{
valueLabelMax.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
CGRectGetMaxY(titleLabel.frame),
50, 20);

valueLabelMid.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
CGRectGetMaxY(titleLabel.frame) + (self.bounds.size.height - CGRectGetMaxY(titleLabel.frame) - CGRectGetMinY(dateRangeStartLabel.frame) - 20)/2,
50, 20);

valueLabelMin.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
^CGFloat(){if(_showDateRange){return CGRectGetMinY(dateRangeStartLabel.frame)-20;}else{return self.bounds.size.height - 20;}}(),
50, 20);
};

if (animated) {
[UIView animateWithDuration:0.3 animations:^{
setLabelFrames();
}completion:^(BOOL finished){
completion();
}];
}else{
setLabelFrames();
completion();
}
}

积木很棒!

最佳答案

像这样评估它:

CGRect r = CGRectMake(100,^CGFloat(){return 1.0f;}(),100,100);
^^

再举个例子,引入一个参数:

// creates a CGRect with all values set to the parameter (12 in this example)
CGRect r = ^CGRect(CGFloat p){return (CGRect){p,p,p,p};}(12);

关于objective-c - 创建结构时的内联 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16731336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com