iOS Swift + UIKit 編程規範指南
本指南聚焦 Swift 語言特性與 UIKit 框架設計理念,結合蘋果官方推薦與工業界最佳實踐,覆蓋命名規範、代碼結構、UI 開發、性能優化等核心維度,旨在提升代碼可讀性、可維護性與擴展性。
一、命名規範
- 標識符命名
- 類 / 結構體 / 枚舉:採用大駝峯式(UpperCamelCase),前綴體現模塊 / 功能,如
UserProfileViewController、OrderStatusEnum。
- 方法 / 變量 / 常量:小駝峯式(lowerCamelCase),動詞開頭描述行為(方法),名詞體現含義(變量),如
fetchUserData()、userNameLabel、maxRetryCount。
- 常量:全大寫 + 下劃線分隔,僅用於全局常量,如
let API_BASE_URL = "https://api.example.com"(局部常量仍用小駝峯)。
- IBOutlets:以控件類型結尾,避免
_或冗餘前綴,如submitButton(而非btnSubmit/submitBtn)、emailTextField。
- 協議命名
- 功能型協議以
-able/-ible結尾,如ReusableView、DataLoadable;委託協議後綴為Delegate/DataSource,如TableViewDelegate。
- 枚舉成員
- 枚舉名採用大駝峯,成員用小駝峯(或全小寫 + 下劃線,根據語義),如:swift
enum NetworkError: Error {
case requestTimeout
case invalidResponse
}
二、代碼結構與組織
- 文件組織
- 單個類 / 結構體對應一個文件,文件名與類名一致(如
UserViewModel.swift);
- 按模塊 / 功能劃分文件夾,如
Controllers/Models/Views/Utils/Networking;
- 擴展(Extension)按功能拆分,每個擴展聚焦單一職責(如佈局、代理方法、自定義方法),示例:swift
// UserViewController.swift
class UserViewController: UIViewController {
// 核心屬性與初始化
}
// MARK: - UI Setup
extension UserViewController {
private func setupUI() { ... }
}
// MARK: - UITableViewDelegate
extension UserViewController: UITableViewDelegate { ... }
- 類設計原則
- 遵循單一職責原則:一個類僅負責一個功能模塊(如
NetworkManager僅處理網絡請求,不包含 UI 邏輯);
- 優先使用組合優於繼承:通過協議擴展、組件化拆分替代複雜繼承鏈;
- 控制器瘦身:將數據處理、業務邏輯剝離至
ViewModel/Manager,控制器僅負責 UI 渲染與事件轉發。
三、UIKit 開發規範
- UI 佈局
- 代碼佈局優先:推薦使用
SnapKit/NSLayoutConstraint純代碼佈局,避免 Storyboard/XIB(複雜頁面可拆分 XIB,但禁止大規模 Storyboard 耦合);
- Auto Layout 規範:
- 約束命名體現作用,如
titleLabelCenterYConstraint;
- 使用
activate批量激活約束,避免逐個isActive = true:swift
NSLayoutConstraint.activate([
titleLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor),
titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20)
])
- 佈局分離:將佈局代碼封裝在
setupConstraints()私有方法中,統一調用。
- 控件使用
- 複用機制:UITableView/UICollectionView 必須註冊複用標識符,且標識符與 Cell 類名一致:swift
tableView.register(UserCell.self, forCellReuseIdentifier: String(describing: UserCell.self))
- 懶加載控件:避免
viewDidLoad中一次性初始化所有控件,使用lazy var延遲加載:swift
private lazy var userNameLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 16, weight: .medium)
label.textColor = .darkText
return label
}()
- 事件處理
- 按鈕點擊等事件通過
addTarget綁定,方法名以on開頭,如onSubmitButtonTapped(_:);
- 避免在事件方法中直接寫業務邏輯,轉發至
ViewModel處理:swift
@objc private func onSubmitButtonTapped(_ sender: UIButton) {
viewModel.submitForm(userName: userNameTextField.text ?? "")
}
四、Swift 語言特性規範
- 可選類型處理
- 強制解包(
!)僅用於 100% 非空場景(如 IBOutlets 已關聯),否則使用可選綁定(if let/guard let)或空合運算符(??):swift
guard let userName = userNameTextField.text, !userName.isEmpty else {
showError(message: "用户名不能為空")
return
}
- 類型轉換優先用
as?+ 可選綁定,避免as!崩潰。
- 集合與循環
- 遍歷集合優先用
for-in,避免 C 風格循環;
- 使用高階函數(
map/filter/reduce)簡化邏輯,如:swift
let activeUsers = users.filter { $0.isActive }.map { $0.name }
- 錯誤處理
- 網絡請求、數據解析等場景使用
do-catch捕獲錯誤,自定義錯誤枚舉遵循Error協議;
- 禁止用
try!忽略錯誤(除非明確無需處理)。
五、性能與內存管理
- 內存管理
- 委託 / 閉包避免循環引用:委託用
weak,閉包捕獲列表標註[weak self]/[unowned self]:
swift
networkManager.fetchData { [weak self] result in
guard let self = self else { return }
self.handleResult(result)
}
- 圖片加載使用
UIImage(named:)(緩存)或UIImage(contentsOfFile:)(非緩存),避免內存泄漏。
- 渲染優化
- 避免在
draw(_:)中繪製複雜圖形,優先用CALayer;
- 列表滑動優化:Cell 高度緩存、異步加載圖片、避免
cellForRowAt中計算佈局。
六、註釋規範
- 文檔註釋:類 / 方法使用
///或/** */添加説明,包含參數、返回值、異常(Xcode 可自動生成文檔):
swift
/// 根據用户ID獲取用户信息
/// - Parameters:
/// - userId: 用户唯一標識
/// - completion: 回調返回用户模型或錯誤
func fetchUser(userId: String, completion: @escaping (Result<User, Error>) -> Void)
- 代碼註釋:僅對複雜邏輯、特殊處理添加註釋,避免冗餘(如
// 創建按鈕無意義)。
七、工程配置規範
- 依賴管理:優先使用 Swift Package Manager(SPM),其次 CocoaPods,避免手動導入框架;
- 資源管理:圖片 / 顏色 / 字符串統一管理,如
Assets.xcassets分類存儲圖片,Constants.swift定義全局常量;
- 版本控制:提交信息遵循
[模塊] 操作:描述(如[User] Fix: 修復用户名驗證邏輯),避免大文件提交。
八、安全與兼容性
- 數據校驗:用户輸入、網絡返回數據必須校驗合法性,避免空值 / 越界;
- 系統版本適配:使用
if #available(iOS 15.0, *)判斷 API 兼容性,避免崩潰;
- 隱私合規:敏感權限(如相機、定位)需在
Info.plist添加描述,如NSCameraUsageDescription。
遵循以上規範可顯著降低團隊協作成本,同時讓代碼更貼合蘋果生態設計哲學,減少潛在 Bug 與性能問題。建議結合項目實際制定補充細則,並通過 Lint 工具(如 SwiftLint)自動化檢查規範執行情況。