iOS開發規範彙總(一)
命名規範
駝峰法
大駝峰
檔名、class、struct、enum、protocol 名稱首字母大寫,即大駝峰,例如:
UIViewController
RCView
RCHandler
小駝峰:
命名變數、方法、引數、swift列舉成員時,第一個單詞的首字母應當小寫,即小駝峰,例如:
swift
myRefreshControl、
infoArray、
numberOfCellInSectionArray、
viewDidLoad
其他
Swift方法命名的一些細節
```swift // at 表示在哪裡,語義更加清晰 func add(_ anItem: Any,at index: Int) {
} ``` 命名中出現英文縮寫例如JSON、URL、ID,要麼用全部大寫,要麼用全部小寫
swift
class IDUtil {}
func idToString(){
}
協議命名
根據蘋果介面設計指導準則, 1. 協議名稱用來描述一些東西是什麼的時候是名詞,例如:Collection、WidgetFactory。 2. 若協議名稱用來描述能力應該以-ing, -able, 或 -ible結尾,例如:Equatable、Resizing。 3. 在定義delegate方法時第一個未命名的引數應該是被代理的物件,例如常見的
```js func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { ... }
``` Foundation和UIKit中的的各種命名都是最標準的蘋果規範,我們都可以拿來做參考。
巨集定義 VS 全域性靜態常量
巨集定義比較方便用來條件編譯,但是也有一些弊端: 1. 巨集定義會在編譯期間挨個做替換,在比較多的地方使用會導致編譯速度變慢,所以如果在全域性都使用一個值的話,可以考慮使用全域性靜態常量來替代巨集定義。 2. 巨集定義是直接替換有時候會有坑,如果是表示式儘量加上括號
巨集定義: ```objective-c
define kScaleSpace 30 // OC風格:首字母用k,第二個字母大寫,後面遵循駝峰
define SCALE_SPACE 30 // C語言風格,所有字母大寫,單詞用下劃線分割
endif
// 狀態檢查 #define MJRefreshCheckState \ MJRefreshState oldState = self.state; \ if (state == oldState) return; \ [super setState:state];
// 非同步主執行緒執行,不強持有Self #define MJRefreshDispatchAsyncOnMainQueue(x) \ __weak typeof(self) weakSelf = self; \ dispatch_async(dispatch_get_main_queue(), ^{ \ typeof(weakSelf) self = weakSelf; \ {x} \ });
```
條件編譯舉例:debug環境日誌列印,release環境遮蔽日誌 ```js
ifdef DEBUG
// 除錯狀態, 開啟LOG功能
#define ZHLog( s, ... ) NSLog( @"[%@:(%d)] %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
else
// 釋出狀態, 關閉LOG功能
#define ZHLog(format, ...)
endif
``` weak strong dance問題解決 之巨集定義 weakify strongify
```js
ifndef WeakStrongDefine_h
define WeakStrongDefine_h
//1. 測試且 ARC 環境
ifndef weakify
define weakify(object) autoreleasepool {} weak __typeof(object) object####weak = object;
endif
ifndef strongify
define strongify(object) autoreleasepool {} typeof(object) object = object####weak;
endif
//2. 正式且 ARC 環境
ifndef weakify
define weakify(object) try {} @catch (...){} weak __typeof(object) object####weak = object;
endif
ifndef strongify
define strongify(object) try {} @catch (...){} typeof(object) object = object####weak;
endif
//3. 測試且非 ARC 環境
ifndef weakify
define weakify(object) autoreleasepool {} block __typeof(object) object####block = object;
endif
ifndef strongify
define strongify(object) autoreleasepool {} typeof(object) object = object####block;
endif
//4. 正式且非 ARC 環境
ifndef weakify
define weakify(object) try {} @catch (...){} block __typeof(object) object####block = object;
endif
ifndef strongify
define strongify(object) try {} @catch (...){} typeof(object) object = object####block;
endif
endif / WeakStrongDefine_h /
//使用舉例
@weakify(self) self.someBlock = ^(){ @strongify(self) [self doSomething]; } ```
全域性靜態常量舉例:
objective-c
static const NSString* kXXAppCommonBaseURL = @"http://www.baidu.com"; //logo寬度
static const NSString* kXXAppWeiXinKey = "asdfasdfasdrewwdfasdf";
static CGFloat const kXXAppContainerHeight = 230;
註釋
檔案註釋
採用Xcode自動生成的註釋格式,修改部分引數
其中專案名稱、建立人、公司/組織版權需要填寫正確。 最下面建議寫上檔案中程式碼的用途
```js //
// ZHHomeViewController.m
// ZHPractiseApp
//
// Created by mardolf on 2021/11/3.
// Copyright © 2021 馬爾道夫. All rights reserved.
// 頁面-首頁 ```
方法註釋
Xcode中自帶文件標準註釋方法 option + command + /
js
/// 方法功能描述
/// @param tableView <#tableView description#>
/// @param section <#section description#>
/// @return section <#section description#>
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
...
}
普通註釋
js
// 這是單行註釋
/*這是多行註釋*/
TODO註釋
// TODO: 待辦事項
程式碼結構標記
```objective-c // Objective-C版
paragma mark - life cycle
...生命週期函式程式碼...
paragma mark - XXDelegate & XXDatasource
...XX代理實現... 一些方法 ```
```swift // Swift版 // MARK: - life cycle
// MARK: - XXDelegate & XXDatasource ```
日期格式化細節
js
使用YYYY-MM-DD
- `YYYY`使用的是`當前周所在的年份(Week of Year)`
使用yyyy-MM-DD
- `yyyy`使用的是`日曆年`,我們應該使用`日曆年`這種方式
大部分情況下兩者得到的格式化字串是相同的,但是,如果遇到跨年的周,例如2021-12-30日 在使用YYYY格式的情況下打印出來就是 2022-12-30,這就不對了,差了一年。
判斷字串是否為空
oc直接使用 lenth 是否為0
swift 由於演算法效率問題官方不建議使用.count,而是使用 isEmpty
swift
var str = ""
//判斷空值
if str.isEmpty {
}
//判斷非空
if str.isEmpty == false {
}
標點符號
- 判斷語句中 if後面的條件不需要使用括號"()"
- 一行程式碼不需要使用分號";"結尾