不理解示例代码中1代码行的含义

时间:2013-07-03 02:41:46

标签: c

我已经下载了示例代码。它有一个类似

的代码行
 CGPointSPUserResizableViewAnchorPointPair upperRight = { CGPointMake(self.bounds.size.width, 0.0), SPUserResizableViewUpperRightAnchorPoint };

但是当我重写它时:

CGPointSPUserResizableViewAnchorPointPair lowerMiddle;
if (self.isScaled)
{
    lowerMiddle = { CGPointMake(self.bounds.size.width/2, self.bounds.size.height), SPUserResizableViewLowerMiddleAnchorPoint };
}

出现错误。所以我不知道这段代码的含义是什么。

2 个答案:

答案 0 :(得分:2)

示例代码中的struct声明如下:

typedef struct CGPointSPUserResizableViewAnchorPointPair {
    CGPoint point;
    SPUserResizableViewAnchorPoint anchorPoint;
} CGPointSPUserResizableViewAnchorPointPair;

以下是您引用的代码行,重新格式化以便于阅读:

CGPointSPUserResizableViewAnchorPointPair upperRight = {
    CGPointMake(self.bounds.size.width, 0.0),
    SPUserResizableViewUpperRightAnchorPoint
};

由于此行创建变量,因此可以使用复合初始值设定项对其进行初始化。复合初始值设定项是括号括起的列表,其中包含 1 的每个struct成员的初始值。因此,CGPointMake调用的返回值初始化upperRight.pointSPUserResizableViewUpperRightAnchorPoint变量初始化upperRight.anchorPoint

在重写代码中对lowerMiddle的赋值不是创建变量,您不能使用复合初始值设定项。您需要以不同的方式设置结构成员。一种方法是依次为每个成员分配:

CGPointSPUserResizableViewAnchorPointPair lowerMiddle;
if (self.isScaled)
{
    lowerMiddle.point = CGPointMake(self.bounds.size.width/2, self.bounds.size.height);
    lowerMiddle.anchorPoint = SPUserResizableViewLowerMiddleAnchorPoint;
}

另一种方法是使用复合文字。复合文字就像变量定义中的复合初始值设定项,除了必须将其“转换”为正确的类型:

CGPointSPUserResizableViewAnchorPointPair lowerMiddle;
if (self.isScaled)
{
    lowerMiddle = (CGPointSPUserResizableViewAnchorPointPair){
        CGPointMake(self.bounds.size.width/2, self.bounds.size.height),
        SPUserResizableViewLowerMiddleAnchorPoint
    };
}

脚注1.复合初始值设定项还有其他形式,但这是最简单的,也是您的示例使用的形式。

答案 1 :(得分:0)

初始化结构的语法{ <field>, <field> }只能在变量初始值设定项中使用。

修改

根据tia链接的问题,这应该有效:

lowerMiddle = (CGPointSPUserResizableViewAnchorPointPair) {
    CGPointMake(self.bounds.size.width/2, self.bounds.size.height), 
    SPUserResizableViewLowerMiddleAnchorPoint
};