速记比较最终太长而无法理解

时间:2015-08-09 18:27:44

标签: ios objective-c

有一个" Clamp"从Ray Wenderlich类的库中完成功能 - 确切地说是SKTUtils。这种钳位功能是用速记写的,但我似乎无法理解。这个夹子的目的是限制一个区域的位置 - 游戏"相机"跟随_player.position,同时确保玩家永远不会看到游戏地图之外的虚无。这是功能:

CGFloat Clamp(CGFloat value, CGFloat min, CGFloat max)
{
    return value < min ? min : value > max ? max : value;
}

以下是它使用的方法,它自己使用的方法是在'didFinishUpdate&#39;方法:

-(CGPoint)pointToCenterViewOn:(CGPoint)centerOn
{   
    CGFloat x = Clamp(centerOn.x, self.size.width/2,  _backgroundLayer.layerSize.width -  self.size.width/2); //Value, Min, Max.
    CGFloat y = Clamp(centerOn.y, self.size.height/2, _backgroundLayer.layerSize.height - self.size.height/2);

    return CGPointMake(-x, -y);
}


-(void)didFinishUpdate
{
    _worldNode.position = [self centerViewOnPoint:_player.position];
}

有人可以解释一下吗?

value < min ? min : value > max ? max : value

我只能部分理解短暂的开头:

if (value < min)
{
    value = min;
}
else if (value > min)
{
    value > max??????
}

2 个答案:

答案 0 :(得分:3)

以下是对value < min ? min : value > max ? max : value

的解释
if (value < min)
{
    return min
}
else
{
    if (value > max)
    {
        return max
    }
    else
    {
        return value
    }
}

答案 1 :(得分:2)

此处部分涉及运算符优先级。用一些括号来帮助阅读会更好。比较运算符绑定比三元条件更严格,所以你有:

(value < min) ? min : ((value > max) ? max : value)

从那以后,它只是从左到右进行评估。唯一棘手的一点是第一个条件运算符的else分支本身就是另一个条件运算符。如果要展开它,这相当于else if。因此,第二个条件的else分支是整个表达式的else。

要将此转换为if语句,您可以执行以下操作:

CGFloat retVal;
if( value < min ){
    retVal = min;
}
else if( value > max ){
    retVal = max;
}
else {
    retVal = value;
}

return retVal;

你可能也喜欢这种方法来限制一个值:

MAX(min_limit, MIN(value, max_limit))

使用MAXMIN宏来评估max_limitvalue的较低者以及其中较高者或min_limit,从而产生结果在min_limitmax_limit(包括)之间的范围内。效果是一样的;我认为这更容易阅读。