一、提要
通過以官方的CGSize為例,自定義Objective-C中的結構體,并使用。
二、CGSize
1、定義結構體CGSize
/* Sizes. */
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
對應的
struct 結構體名{
類型名 成員名1;
類型名 成員名2;
... ...
類型名 成員名n;
};
上述首先自定義了一個結構體,這和C語言里面自定義結構體一樣。typedef struct CGSize CGSize是給此結構體定義了一個別名,在OC里面結構體別名和結構體名盡量保持一致?看文檔是這么寫的。
2、CGSizeMake
/* Make a size from `(width, height)'. */
CG_INLINE CGSize CGSizeMake(CGFloat width, CGFloat height);
這里CG_INLINE是一個宏:# define CG_INLINE static inline,這是系統的一個宏,如果你不用這個宏,可以直接寫成static inline CGSize CGSizeMake(CGFloat width, CGFloat height);
三、自定義結構體
這里以自定義一個button的點擊范圍的結構體為例
struct ClickSize {
CGFloat top;
CGFloat left;
CGFloat bottom;
CGFloat right;
};
typedef struct ClickSize ClickSize;
CG_INLINE ClickSize
ClickSizeMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)
{
ClickSize clickSize;
clickSize.top = top;
clickSize.left = left;
clickSize.bottom = bottom;
clickSize.right = right;
return clickSize;
};
這就OK了,就剩下使用了,使用的時候需要引入頭文件。
這里是寫一個擴大button點擊方法的例子,使用了結構體
/**
擴大button的點擊范圍
@param size 設置點擊區域,控制上、左、下、又的擴大外圍
*/
- (void)enlargeClickAreaWithClickArea:(ClickSize)size;
/// 擴大button的點擊范圍
- (void)enlargeClickAreaWithClickArea:(ClickSize)size {
objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:size.top], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:size.right], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size.bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size.left], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
這里ClickSize直接被傳入參數使用,傳入參數的時候和CGSize一樣,而且還會有提示,很好用。
[view enlargeClickAreaWithClickArea:CGSizeMake( 10, 10, 10, 10)];
四、最后
- 結構體定義起來個人覺得還是比較麻煩的,但是一次定義了之后用起來還是很好用的。
- OC中結構體真是很好用,但是對性能什么的會不會造成什么大的影響這還沒研究,應該是不會吧,我看在官方的文檔中也用了很多結構體,有興趣的小伙伴我們可以一起交流交流。