原创:知识点总结性文章
创作不易,请珍惜,之后会持续更新,不断完善
个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的IOS成长历程,希望能与大家一起进步
温馨提示:由于简书不支持目录跳转,大家可通过command + F 输入目录标题后迅速寻找到你所需要的内容
价值
- 统一团队书写习惯,为效率工具提供了技术模版,奠定了自动化实践的基石
- 根除阅读障碍,有效降低CR和轮岗成本
- 增强了团队和谐
变量
- 只能以字母、数字、下划线、$组成;
- 不能以数字开头;
- 遵循小驼峰命名方式;
- 不能与C语言的关键字重名;
new
copy
- 区分大小写;
- 先声明后使用;
- 不能重复定义同名变量;
@interface UCARSomeBusinessService () <SomeProtocol, OtherProtocol> {
// 声明一些私有变量,但不推荐;推荐使用私有属性方式声明
NSString *title;
NSInteger count;
}
属性
// 公共属性应该声明在类头文件(.h)中
@interface UCARSomeBusinessService : UCARBaseBusinessService
@property (nonatomic, strong) UCARSomeProperty *someProperty;
@property (nonatomic, copy) NSString *otherProperty;
@end
// 私有属性应该声明在类实现文件(.m)的延展(匿名的类目)中
@interface UCARSomeBusinessService ()
@property (nonatomic, strong) UCARSomeProperty *someProperty;
@property (nonatomic, copy) NSString *otherProperty;
@end
常量
// 常量格式:常量首选内联字符串字面量或数字,因为常量可以轻易重用并且可以快速改变而不需要查找和替换;
// 常量应该声明为 static 常量而不是 #define ,除非非常明确地要当做宏来使用
static NSString *const viewControllerTitle = @"派单页面";
static const CGFloat cellHeight = 66.66;
枚举
// 枚举格式:关键字、空格、换行、单行注释(居右)按如下书写
typedef NS_ENUM(NSInteger, UCAROrderState) {
UCAROrderState_Dispatching = 0, // 派单中
UCAROrderState_Dispatched = 1, // 派单成功
UCAROrderState_Arrival = 2, // 司机已到达
UCAROrderState_InService = 3 // 服务中
};
// 当用到位掩码时,使用 NS_OPTIONS 宏
typedef NS_OPTIONS(NSUInteger, UCARAdCategory) {
UCARAdCategoryAutos = 1 << 0, // Autos
UCARAdCategoryJobs = 1 << 1, // Jobs
UCARAdCategoryRealState = 1 << 2, // RealState
UCARAdCategoryTechnology = 1 << 3 // Technology
};
Method
方法定义要遵循单一原则,方法签名不要超过100字符,方法体不宜过长,方法名较短时应单行书写
方法格式:“+/-”+空格+(返回值类型)+方法名+空格+{+换行
- (void)produceView {
// Do something
}
- (UIView *)produceViewWithModel:(UCARModel *)model {
// Do something
}
+ (UIView *)produceViewWithTag:(NSInteger)tag {
// Do something
}
@protocol
@interface
Delegate
尽量使用can
、should
、will
、did
表明回调意愿&
时机;
属性&
方法添加注释:.h
文件中的注释,必须使用 Command + /
生成的模版进行编写
属性&
方法过多时,视情况使用 “换行” 分组
// import分组次序:Frameworks、Services、UI
#import <SomeFramework/SomeProtocol.h>
@protocol UCARSomeBusinessDelegate <NSObject, UCARSomeDelegate>
@interface UCARSomeBusinessService : UCARBusinessService <UCARSomeBaseService, UCAROtherBaseService>
@required
/**
* 属性说明
* @note 额外说明的注意项,说明一些需要注意的地方,没有可取消此项。
*/
@property (nonatomic, copy) NSString *otherProperty;
@property (nonatomic, strong) UCARSomeProperty *someProperty;
/**
* 方法说明
* @param object 一个参数
* @return 一个返回值
* @note 额外说明的注意项,说明一些需要注意的地方,没有可取消此项。
*/
- (void)shouldUpdateViewWithModel:(UCARSomeViewModel *)model;
- (void)shouldUpdateViewWithError:(NSError *)error;
- (void)willChangeDataSource;
- (void)didChangeDataSource;
@end
@implementation
@class UCARAnyProperty;
#pragma mark - 常量
#pragma mark - 枚举
@interface UCARSomeBusinessService () <SomeProtocol, OtherProtocol>
#pragma mark - 私有属性
@end
@implementation UCARSomeBusinessService
//方法列表使用pragma分组,并遵守如下次序, 且# pragma mark - 与上下各添加一个空行
#pragma mark - Life cycle
- (void)someMethod:(UCARSomeModel *)model {
// Do something
// Block 书写格式
[UIView animateWithDuration:0.3 animations:^{
// Do something
} completion:^(BOOL finished) {
// Do something
}];
}
#pragma mark - Custom Delegates
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - Getters and Setters
@end
UIViewController
#pragma mark - Life cycle
- (instancetype)init {
}
- (void)viewDidLoad {
}
- (void)viewWillAppear:(BOOL)animated {
}
- (void)viewDidAppear:(BOOL)animated {
}
- (void)didReceiveMemoryWarning {
}
- (void)viewWillDisappear:(BOOL)animated {
}
- (void)viewDidDisappear:(BOOL)animated {
}
- (void)dealloc {
}
#pragma mark - Events
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark - UIOtherComponentDelegate
#pragma mark - Custom Delegates
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - Getters and Setters
UIView
AutoLayout
、Frame
禁止混合使用,只能选择一种方式!!!
#pragma mark - Life cycle
- (instancetype)init {
}
- (instancetype)initWithFrame:(CGRect)frame {
}
- (void)updateConstraints {
}
- (void)layoutSubviews {
}
+ (BOOL)requiresConstraintBasedLayout {
return YES;
}
- (void)dealloc {
}
#pragma mark - Events
#pragma mark - UIOtherComponentDelegate
#pragma mark - Custom Delegates
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - Getters and Setters
Snippets
IF/ELSE/SWITCH/FOR/WHILE
语句格式:关键字+空格+(条件)+空格+{+换行
IF
语句(如果IF
语句不是方法体第一行,与上面的代码之间添加一行空行,如果ELSE
语句不是最后一行,与下面代码之间加一行空行)
if (condition1) {
// Do something1
} else if (condition2) {
// Do something2
} else {
// Do anything
}
不推荐
if (condition) return value;
if (condition)
return value;
SWITCH
语句
switch (condition) {
case 1:
// ...
break;
case 2: {
// ...
// Multi-line example using braces
break;
}
default:
// ...
break;
}
FOR
语句
for (NSObject *object in list) {
// Do something
}
for (int i = 0; i < N; i++) {
// Do something
}
WHILE
语句
while (condition) {
// Do something
}
do {
// Do something
} while (condition)
方法命名
通用命名、属性方法命名、Delegate
方法命名、集合方法命名、方法参数命名、私有方法命名
通用命名
1、使用小驼峰命名规则
2、对于表示对象采取的操作的方法,使用动词开始
- (void)invokeWithTarget:(id)target;
- (void)selectTabViewItem:(NSTabViewItem *)tabViewItem;
3、所有参数之前使用关键字
- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag; ✅
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag; ❌
4、在参数之前创建单词描述参数
- (id)viewWithTag:(NSInteger)aTag; ✅
- (id)taggedView:(int)aTag; ❌
5、在创建比继承方法更具体的方法时,在现有方法的末尾添加新关键字
- (id)initWithFrame:(CGRect)frameRect; 父类
- (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide; 子类
6、不要使用“and”
来链接作为接收者属性的关键字
- (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes; ✅
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes; ❌
7、可以使用“and”
来链接两个单独的操作
- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;
属性方法命名
1、名词属性格式
- (type)noun;
- (void)setNoun:(type)aNoun;
例如:
- (NSString *)title;
- (void)setTitle:(NSString *)aTitle;
2、形容词属性格式
- (BOOL)isAdjective;
- (void)setAdjective:(BOOL)flag;
例如:
- (BOOL)isEditable;
- (void)setEditable:(BOOL)flag;
3、动词属性格式(动词现代式)
- (BOOL)verbObject;
- (void)setVerbObject:(BOOL)flag;
例如:
- (BOOL)showsAlpha;
- (void)setShowsAlpha:(BOOL)flag;
4、不要使用分词将动词转换为形容词
- (void)setAcceptsGlyphInfo:(BOOL)flag; ✅
- (BOOL)acceptsGlyphInfo; ✅
- (void)setGlyphInfoAccepted:(BOOL)flag; ❌
- (BOOL)glyphInfoAccepted; ❌
5、可以使用情态动词(can
, should
, will
等)来提高清晰性,但不要使用do
或 does
- (void)setCanHide:(BOOL)flag; ✅
- (BOOL)canHide; ✅
- (void)setShouldCloseDocument:(BOOL)flag; ✅
- (BOOL)shouldCloseDocument; ✅
- (void)setDoesAcceptGlyphInfo:(BOOL)flag; ❌
- (BOOL)doesAcceptGlyphInfo; ❌
6、只有在方法需要间接返回多个值的情况下,才使用 get
- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;
Delegate方法命名
1、用于通知委托对象操作即将发生或已经发生的方法名中要使用 did
或 will
- (BOOL)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;
2、用于询问委托对象可否执行某操作的方法名中可使用did
或 will
,但最好使用 should
- (BOOL)windowShouldClose:(id)sender;
集合对象方法命名(Array、Set、Dictionary、Table等)
集合对象(集合中的对象被称之为元素), 约定要具备如下形式的方法
- (void)addElement:(elementType)anObj;
- (void)removeElement:(elementType)anObj;
- (NSArray *)elements;
例如:
- (void)addLayoutManager:(NSLayoutManager *)obj;
- (void)removeLayoutManager:(NSLayoutManager *)obj;
- (NSArray *)layoutManagers;
- (void)insertLayoutManager:(NSLayoutManager *)obj atIndex:(int)index;
- (void)removeLayoutManagerAtIndex:(int)index;
方法参数命名
1、参数采用小驼峰命名
2、不要在参数名中使用 pointer
或 ptr
,让参数的类型来说明它是指针
3、避免使用 one
, two
,...,作为参数名
4、避免为节省几个字符而缩写
按照 Cocoa
惯例,以下关键字与参数联合使用
...action:(SEL)aSelector
...alignment:(int)mode
...atIndex:(int)index
...content:(NSRect)aRect
...doubleValue:(double)aDouble
...floatValue:(float)aFloat
...font:(NSFont *)fontObj
...frame:(NSRect)frameRect
...intValue:(int)anInt
...keyEquivalent:(NSString *)charCode
...length:(int)numBytes
...point:(NSPoint)aPoint
...stringValue:(NSString *)aString
...tag:(int)anInt
...target:(id)anObject
...title:(NSString *)aString
xcassets
1、按模块分目录,目录首字母大写,大驼峰命名
|--CreateOrder
|--DispatchOrder
|--OrderDetail
2、图片命名格式:模块名称页面名称控件名称[_状态名称]
|--CreateOrder
| |--createOrder_selectAddress_okButton_normal
| |--createOrder_selectAddress_okButton_highlighted
| |--createOrder_selectAddress_okButton_disabled
| |--createOrder_selectAddress_okButton_selected
| |--createOrder_selectAddress_okButton_focused
strings
1、按模块分组
// 下单模块
...
...
// 派单模块
...
2、文案键值对,键全大写,格式:模块名称页面名称控件名称[_状态名称]
// 下单模块
"CREATEORDER_SELECTADDRESS_OKBUTTON_NORMAL" = "完成";
"CREATEORDER_SELECTADDRESS_CANCELBUTTON_NORMAL" = "取消";
// 派单模块
"DISPATCHORDER_ORDERCARD_RECREATEBUTTON_NORMAL" = "重新下单";
网友评论