-4

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

 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 };
}

并出现错误。所以我不知道这段代码是什么意思。

4

2 回答 2

2

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

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

这是您引用的代码行,重新格式化以更易于阅读:

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

由于这一行创建了变量,它可以使用复合初始化器来初始化它。复合初始化器是一个用大括号括起来的列表,其中包含每个struct成员的初始值,顺序为1。所以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. 复合初始值设定项还有其他形式,但这是最简单的形式,也是您的示例使用的形式。

于 2013-07-03T02:50:34.810 回答
0

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

编辑:

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

lowerMiddle = (CGPointSPUserResizableViewAnchorPointPair) {
    CGPointMake(self.bounds.size.width/2, self.bounds.size.height), 
    SPUserResizableViewLowerMiddleAnchorPoint
};
于 2013-07-03T02:45:39.213 回答