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

来源:互联网 发布:欧洲旅游机票软件 编辑:程序博客网 时间:2024/06/05 17:15

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;@endUIView+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


0 0
原创粉丝点击