我已经下载了示例代码。它有一个类似
的代码行 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 };
}
出现错误。所以我不知道这段代码的含义是什么。
答案 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.point
,SPUserResizableViewUpperRightAnchorPoint
变量初始化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
};