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
- iOS笔记—对象的结构体属性单个修改方式
- 【iOS开发-40】不能直接修改对象的结构体属性的成员,那怎么办?
- 不允许直接修改对象的结构体属性的成员
- 《ios—单个对象的内存管理》
- OC中修改 对象的结构体属性
- Objective-C 【OC语法:不能修改 某个对象的 结构体属性的 成员】
- iOS-让结构体类型frame的属性可以直接修改
- ios 对象私有属性的访问和修改
- 结构体作为对象的属性
- 结构体作为对象的属性
- 结构体作为对象的属性
- OC 结构体作为对象的属性
- java线程对单个对象的共享的一些方式
- OCDay2-NSString、常见错误、结构体为属性时的访问、对象访问变量与方法的方式、#pragma mark\
- ibatis自学笔记-查询指定id的单个对象
- 控件的创建方式、RelativeLayout基本属性、单个控件常用属性、官方API网址
- 对象数组根据单个属性进行排序
- iOS学习笔记44-IOS 遍历未知对象的属性和方法
- 一个在黑客界引起轰动的菜鸟教材---跟我学编程系列
- 开发模式、代码分层结构
- Android重力感应开发
- $.json $.each $.getJSON的使用
- 基于DragonBoard 410c的家庭智能环保卫士——(11)室内栅格地图位置更新Python实现
- iOS笔记—对象的结构体属性单个修改方式
- 算法训练 字串统计
- Swoole 关于reload重启与回调函数中代码的重载
- Catalan数
- KMP算法的实现(Java语言描述)
- 蓝桥 剪邮票 (dfs+bfs)
- NoHttp的GET 和POST
- Swagger+Spring mvc生成Restful接口文档
- 黑客编程基础