先上一個碼雲地址 碼雲地址html
項目的簡單介紹ios
Constant 模塊 AppUrl : 定義url靜態變量 PublicConstant : 定義cellidentifier, ScreenWidth等變量, BaseColor等變量, 封裝view的一些屬性(.width等), UIDevice分類判斷iPhone X MianCode 模塊 各個模塊 每一個模塊分位四塊:controller(界面跳轉,view切換), control(數據下載, 解析model), model(model申明), cell(view) General 模塊 UserInfo : 示例封裝set/get UserDefaults RootController : 封裝側滑界面 (這是本項目的第一個類, 也是我開始學習swift的第一個類, 包含基本語法的註釋) Library 模塊 示例使用OC混編, 沒有使用CocoaPod的第三方庫 包括 : MJRefresh, DZNEmptyDataSet 等 Resouce 模塊 圖片文件 Config模塊 項目初始文件 Pod 'Alamofire' 網絡請求 'SwiftyJSON' Json解析 'Kingfisher' image緩存 'PKHUD' 加載動畫
這個項目從Xcode的singleView模板建立而來, 通過文件整理歸類和修改建立了一個標準易於維護的最終模板, 你能夠經過如下連接學習 ###一步一步建立一個標準的iOS項目模板git
在從github和碼雲上瀏覽了幾個Swift項目以後我開始了本身的嘗試.github
例如 翔妖除魔 / ZhiHuDaily-Swiftweb
例如 LinXunFeng / LXFWeChatswift
開始動手時候卻發現Swift和OC非常不同, 不知道swift的成員變量怎麼"聲明", oc中經常使用的類別, 類方法成員方法等等緩存
參考資料關於Swift 你可能連變量都不會定義安全
swift變量有兩種類型 : 存儲變量 和 計算變量網絡
用於給一個對象增長屬性, 能夠在建立的時候就賦值(table)ide
// 例如某個model的一個"屬性" let title : String //例如vc的tableView let tableView : UITableView = { let table = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: ScreenWidth, height: ScreenHeight), style: UITableViewStyle.grouped) table.backgroundColor = BackColor //這個時候建立時候self尚未初始化完成,不能self.addsubview return table }()
用於監聽變量值變化的時候執行相應的操做
//userInfo本地保存用戶相關 class UserInfo: NSObject { //計算屬性 static var UserName : String? { //獲取值,可能沒有代碼提示 get{ return UserDefaults.standard.value(forKey: UserNameKey) as? String } //設置值 set(arr){ UserDefaults.standard.set(arr, forKey: UserNameKey) } } }
參考資料 實例方法和類型方法
swift默認就是在其餘地方能夠訪問的, 至關於oc中.h的變量
使用private那麼只能在當前類使用, 同一swift文件也不能夠
使用fileprivate在一個swift文件能夠訪問
class RootController: UIViewController { // MARK: - 單例寫法 //單例/類成員變量,只讀,訪問獲取單例 static let shareSingleton = RootController(); // MARK: - 外部變量,外部能夠賦值 //main vc var mainVC : UIViewController = UIViewController() { didSet { //此時mainVC已經有值,作一些處理 } //private修飾的內部變量 private var leftView : UIView = { let view = UIView.init(frame: CGRect.init(x: 0, y: 64, width: 20, height: ScreenHeight-64)) return view }() }
參考資料單例寫法
例如上邊的"shareSingleton"靜態變量就是Swift中標準的單例寫法了, 具體能夠查看上邊的連接瞭解
簡單瞭解一些以後, 就須要看看swift代碼怎麼寫才更好, 好的代碼 看起來老是賞心悅目的
參考資料
參考資料類別擴展(Extension)
delegate方法寫在擴展哩
public extension UIView { //只讀屬性, 不寫set就是隻讀 var left : CGFloat { get{ return self.frame.origin.x } // set{ // } } //上述方式的簡寫 var right : CGFloat { return self.frame.origin.x + self.frame.size.width } }
由於swift開放的屬性全部類內部均可以訪問無需引用頭文件
因此只須要建立一個swift文件專門用於存儲這些就能夠了
import UIKit //無參宏其實就是靜態變量 let identifierTitle = "TableViewCellIdentifierTitle" let ScreenWidth = UIScreen.main.bounds.size.width let DetailColor = UIColor.init(red: 153/255.0, green: 153/255.0, blue: 153/255.0, alpha: 1) //帶參宏是沒有了, 就用全局方法替代 public func ColorRGB(_ r: Int, _ g: CGFloat, _ b: CGFloat) -> UIColor { return UIColor.init(red: CGFloat(r)/255.0, green: CGFloat(g)/255.0, blue: CGFloat(b)/255.0, alpha: 1) } //也可使用上邊 5.代碼中的這種寫法標記只讀 var ConfigTabHeight : CGFloat { return 120 }
如今結構體裏的屬性也能夠單獨設置了,
view.frame.size.width = 100
步驟十分簡單, 排除第一次自動建立, 手動建立能夠經過一下步驟:
1.建立一個.h文件
2.BuildSeting修改Objective-C Bridge Header的值爲建立的文件, 拖過去便可(推薦使用"$(SRCROOT)"標記相對路徑)
注意swift方法開放給oc要使用"@objc"標誌
//由於OC類NJRefresh調用,因此使用@objc開放給OC類 @objc private func configData() -> Void { }
像oc同樣,導入以後在用到的地方導入頭文件便可使用
import PKHUD
其餘一些項目建議:
原由手機更新iOS11以後發現首頁tab滑動更加卡了, 因而查看了頭條, 騰訊視頻都發現好像確實沒有10流暢.
而後發現系統設置的table也卡出了翔(iOS11.0的iPhone 設置->移動蜂窩網絡), 蘋果生動的當了一次反面教材.
//table優化 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { //這個方法會在加載cell反覆調用, 不要進行耗時操做 let model : HomeModel = homeData.news![indexPath.row] return model.cellHeight } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let model : HomeModel = (homeData.news?[indexPath.row])! //也要儘可能精簡 //不一樣的cell必定要設置不一樣的identifier var cell : HomeTableCell = HomeTableCell() if model.cellHeight == 80 { cell = tableView.dequeueReusableCell(withIdentifier: identifierTitle) as! HomeTableCell cell.setTitleView(model: model) } if model.cellHeight == 120 { cell = tableView.dequeueReusableCell(withIdentifier: identifierOnePic) as! HomeTableCell cell.setOnePicView(model: model) } if model.cellHeight == 140 { cell = tableView.dequeueReusableCell(withIdentifier: identifierThreePic) as! HomeTableCell cell.setThreePicView(model: model) } if !cell.isSetTouch { if #available(iOS 9.0, *) { if self.traitCollection.forceTouchCapability == UIForceTouchCapability.available { self.registerForPreviewing(with: self, sourceView: cell) } } cell.isSetTouch = true } return cell }
參考資料適配11
iOS11, 比較得注意會直接影響界面的就是 安全距離 和 tableView問題, tableview如今必須returen header和footerView
iPhone X:
在iPhone X系統會自動修改StatusBar與Tabbar的高度,Tabbar從49pt變爲83pt。StatusBar由20pt變爲了44pt, 打電話和wifi狀態欄不會增高。
至此, 這篇博客就結束了, 總體來講Swift寫起來並無那麼可怕, 有些地方比OC方便不止一點, 若是swift庫找不到也可使用混編方式, 並且3到4.0變化也很少了,是時候嘗試開始Swift了
感謝各位賞臉