您的位置:首页 > 移动开发 > IOS开发

iOS笔记—对象的结构体属性单个修改方式

2017-04-06 13:56 549 查看
Objective-C语法规定,对象的结构体属性不能单个修改。如果是单独定义的结构体属性则可以单个修改。如象的结构体属性:

self.view.frame.size.width = 10;// 编译器报错"expression is not assignable"


如单独定义的结构体属性:

CGSize mySize;
mySize.width = 9; // 不报错


对象的结构体属性不能单个修改,但是可以整体修改:

view.frame=CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);


因此,我们想修改对象的结构体属性的单个属性的时候,可以采用先定义一个临时结构体变量,然后将对象的结构体属性整体赋给临时结构体变量。再在临时结构体变量中修改单个变量。最后再将整个临时变量的属性全部赋给对象结构体属性。就可以达到修改对象结构体单个属性的需求了。如:

view.frame=CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);CGRect hhgframe  = view.frame;
hhgframe.size.width = 20;
view.frame = hhgframe;


再理清楚一下对象的结构体属性不能单个修改的原理:

在讲之前先要提前注意一点,在view.frame.size.width中,

view是一个Objective-C对象,因此view.frame是Objective-C语法,

frame是一个CGRect结构体,因此frame.size.width是C语言语法,因此这句话中是Objective-C与C同时混用的写法。(有些人可能平时理解的混用是指定义一些C类型的变量如int之类的,而忽略了其实Objective-C和C是可以连着混用的)。这里我们要理清楚一下Objective-C和Cd区别。Objective-C与C最主要得区别是Objective-C在原始的C语言主题上加入面向对象的概念。

Objective-C是C语言的母集合,意指任何原始的C语言程式都可以通过Objective-C编译器而不需要修改,也允许Objective-C使用任何原始的C语言代码。

可能有些人在刚学习在Objective-C语法时记得比较清楚些。Objective-C的点语法其实是一种语法糖,它只是方便了学习其他语言的人转过来学习Objective-C时更容易上手。对于view.frame 实际上会被转义为消息传递的形式[view frame]。而frame.size.width则以C语言的语法为基础,直接可以点出来的。所以view.frame.size.width = 20会变成[view frame].size.width= 20;将Objective-C消息传递转换成C语言的函数调用形式,则变成getFrame().size.width
= 20;写到这里我们就比较清楚的发现,它是一个getter方法,getter方法是并不能赋值的,因此我们将值赋给getter方法时,通过层层转义的xcode编译器会发出错误提醒,提示"expression is not assignable"(表达式不可赋值)

 

至此,我们已经解决了view.frame.size.width = 20;语法报错的问题以及它报错的原因。既然我们已经明白了原理,知道强扭的瓜不甜(连续点对象的结构体单独的属性肯定不能赋值)。那我们就不要强扭吧。

从上文一开始我们就讲对象的结构体属性不能单个修改,但是可以整体修改。所以,我们可以自己新建一个category重写一下结构体的setter和getter方法,用整体修改的办法去修改:

UIView+Extension.h
@interface UIView (Extension)
-setWidth(CGFloat)width;
-(CGFloat)width;
@end

UIView+Extension.m
@implementation UIView (Extension)
- (void)setWidth:(CGFloat)width{
CGRect frame = self.frame;
frame.size.width = size.width;
self.frame = frame;
}
- (CGFloat)width{
return self.frame.size.width;
}
@end

然后我们就可以使用 [view setWidth:20];去单独设置size的width了。其实xcode会自动帮我们生成setter和getter方法,所以更简洁的写法是:

UIView+Extension.h
@interface UIView (Extension)
@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;
@property (nonatomic, assign) CGFloatwidth;
@property (nonatomic, assign) CGFloatheight;
@property (nonatomic, assign) CGSize size;
@property (nonatomic, assign) CGPointorigin;
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐