Objective-C 【OC语法:不能修改 某个对象的 结构体属性的 成员】
2016-02-04 11:41
585 查看
看题目就知道这篇文章写的是什么了。
在OC中是不允许修改某个对象的结构体属性的成员的,上面的语句,backBtn是我们实例化的一个对象,frame是它的结构体属性,而size又是frame这个属性的成员变量。根据OC语法,我们知道上面的代码是错误的。如果想要设置size,我们要这样去做:
上面的解决方案,是把原有对象的结构体属性赋值给一个临时结构体,然后对临时结构体里的成员进行修改,然后把这个修改好的结构体变量直接赋值给原有对象的结构体变量,相当于修改了。
但是我们知道,这种成员有很多,比如说frame中的origin、size,origin中的x、y,size中的width、height。每一个成员我们都这样赋值是很麻烦的,所以我建议大家为其增加一个Category(分类),让每一个对象的这些属性都能直接赋值,而赋值的繁琐语句我们均写在Category中。
#import <UIKit/UIKit.h>
@interface UIView (Extension)
@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;
@property (nonatomic, assign) CGFloat width;
@property (nonatomic, assign) CGFloat height;
@property (nonatomic, assign) CGSize size;
@property (nonatomic, assign) CGPoint origin;
@end
#import "UIView+Extension.h"
@implementation UIView (Extension)
// 重写set方法
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
- (void)setY:(CGFloat)y
{
CGRect frame = self.frame;
frame.origin.y = y;
self.frame = frame;
}
- (void)setWidth:(CGFloat)width
{
CGRect frame = self.frame;
frame.size.width = width;
self.frame = frame;
}
- (void)setHeight:(CGFloat)height
{
CGRect frame = self.frame;
frame.size.height = height;
self.frame = frame;
}
- (void)setSize:(CGSize)size
{
CGRect frame = self.frame;
frame.size = size;
self.frame = frame;
}
- (void)setOrigin:(CGPoint)origin
{
CGRect frame = self.frame;
frame.origin = origin;
self.frame = frame;
}
// 重写get方法
- (CGFloat)x
{
return self.frame.origin.x;
}
- (CGFloat)y
{
return self.frame.origin.y;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (CGFloat)height
{
return self.frame.size.height;
}
- (CGSize)size
{
return self.frame.size;
}
- (CGPoint)origin
{
return self.frame.origin;
}
@end
补充:只写头文件也是可以的,我觉得应该是@property自动生成了对应的get和set方法。这一点有待商榷。
backBtn.frame.size = CGMakeSize(100, 100); // 这样是错误的写法
在OC中是不允许修改某个对象的结构体属性的成员的,上面的语句,backBtn是我们实例化的一个对象,frame是它的结构体属性,而size又是frame这个属性的成员变量。根据OC语法,我们知道上面的代码是错误的。如果想要设置size,我们要这样去做:
CGRect frame = backBtn.frame; frame.size = CGMakeSize(100, 100); <pre name="code" class="objc">backBtn.frame = frame;
上面的解决方案,是把原有对象的结构体属性赋值给一个临时结构体,然后对临时结构体里的成员进行修改,然后把这个修改好的结构体变量直接赋值给原有对象的结构体变量,相当于修改了。
但是我们知道,这种成员有很多,比如说frame中的origin、size,origin中的x、y,size中的width、height。每一个成员我们都这样赋值是很麻烦的,所以我建议大家为其增加一个Category(分类),让每一个对象的这些属性都能直接赋值,而赋值的繁琐语句我们均写在Category中。
#import <UIKit/UIKit.h>
@interface UIView (Extension)
@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;
@property (nonatomic, assign) CGFloat width;
@property (nonatomic, assign) CGFloat height;
@property (nonatomic, assign) CGSize size;
@property (nonatomic, assign) CGPoint origin;
@end
#import "UIView+Extension.h"
@implementation UIView (Extension)
// 重写set方法
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
- (void)setY:(CGFloat)y
{
CGRect frame = self.frame;
frame.origin.y = y;
self.frame = frame;
}
- (void)setWidth:(CGFloat)width
{
CGRect frame = self.frame;
frame.size.width = width;
self.frame = frame;
}
- (void)setHeight:(CGFloat)height
{
CGRect frame = self.frame;
frame.size.height = height;
self.frame = frame;
}
- (void)setSize:(CGSize)size
{
CGRect frame = self.frame;
frame.size = size;
self.frame = frame;
}
- (void)setOrigin:(CGPoint)origin
{
CGRect frame = self.frame;
frame.origin = origin;
self.frame = frame;
}
// 重写get方法
- (CGFloat)x
{
return self.frame.origin.x;
}
- (CGFloat)y
{
return self.frame.origin.y;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (CGFloat)height
{
return self.frame.size.height;
}
- (CGSize)size
{
return self.frame.size;
}
- (CGPoint)origin
{
return self.frame.origin;
}
@end
补充:只写头文件也是可以的,我觉得应该是@property自动生成了对应的get和set方法。这一点有待商榷。
相关文章推荐
- Objective-C的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中使用NSString类操作字符串的方法小结
- Objective-C中NSNumber与NSDictionary的用法简介
- Objective-C中NSLog输出格式大全
- 全面解析Objective-C中的block代码块的使用
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- 以实例讲解Objective-C中的KVO与KVC机制
- 简介Objective-C解析XML与JSON数据格式的方法
- 理解Objective-C的变量以及面相对象的继承特性
- 简单讲解Objective-C的基本特性及其内存管理方式
- Objective-C处理空字符串和页面传值及自定义拷贝
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- Objective-C中类和方法的定义以及协议的使用