iOS Swift4項目EFarm學習和總結

Swift項目

先上一個碼雲地址 碼雲地址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

第一個swift類

在從github和碼雲上瀏覽了幾個Swift項目以後我開始了本身的嘗試.github

例如 翔妖除魔 / ZhiHuDaily-Swiftweb

例如 LinXunFeng / LXFWeChatswift

開始動手時候卻發現Swift和OC非常不同, 不知道swift的成員變量怎麼"聲明", oc中經常使用的類別, 類方法成員方法等等緩存

1. Swift變量

參考資料關於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)
        }
    }
}

2. 實例方法(變量)和類型方法(變量)

參考資料 實例方法和類型方法

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
    }()
}

3. 單例寫法

參考資料單例寫法

例如上邊的"shareSingleton"靜態變量就是Swift中標準的單例寫法了, 具體能夠查看上邊的連接瞭解

4. Swift命名和代碼風格, 避免OC風格的代碼

簡單瞭解一些以後, 就須要看看swift代碼怎麼寫才更好, 好的代碼 看起來老是賞心悅目的

參考資料

Swift命名和代碼風格

5. 類別擴展(Extension)

參考資料類別擴展(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
    }
}

6. 宏/全局靜態變量

由於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
    }

7. CGRect、CGSize和CGPoint

參考資料CGRect、CGSize和CGPoint

如今結構體裏的屬性也能夠單獨設置了,

view.frame.size.width = 100

8. Swift與oc混編

步驟十分簡單, 排除第一次自動建立, 手動建立能夠經過一下步驟:

1.建立一個.h文件

2.BuildSeting修改Objective-C Bridge Header的值爲建立的文件, 拖過去便可(推薦使用"$(SRCROOT)"標記相對路徑)

注意swift方法開放給oc要使用"@objc"標誌

//由於OC類NJRefresh調用,因此使用@objc開放給OC類
    @objc private func configData() -> Void {
    }

9. CocoaPod使用

像oc同樣,導入以後在用到的地方導入頭文件便可使用

import PKHUD

10. 其餘的,湊個10

其餘一些項目建議:

  1. 反樸歸真,使用系統的nav或tab,體檢更好
  2. 使用wkwebview代替uiwebview,體驗更好
  3. 簡單適配3dtouch, peek/pop讓你的項目體驗更好
  • TableView優化

原由手機更新iOS11以後發現首頁tab滑動更加卡了, 因而查看了頭條, 騰訊視頻都發現好像確實沒有10流暢.

而後發現系統設置的table也卡出了翔(iOS11.0的iPhone 設置->移動蜂窩網絡), 蘋果生動的當了一次反面教材.

  1. cell高度預先計算
  2. cell使用不一樣identifier, cellForRow應該只有一個賦值操做
  3. 特別複雜, 無法使用2的話能夠採用繪製方法, github有不少輪子能夠去研究一下
//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
    }
  • iOS11和iPhone X

參考資料適配11

iOS11, 比較得注意會直接影響界面的就是 安全距離 和 tableView問題, tableview如今必須returen header和footerView

iPhone X:

X 的人機交互指南

在iPhone X系統會自動修改StatusBar與Tabbar的高度,Tabbar從49pt變爲83pt。StatusBar由20pt變爲了44pt, 打電話和wifi狀態欄不會增高。


至此, 這篇博客就結束了, 總體來講Swift寫起來並無那麼可怕, 有些地方比OC方便不止一點, 若是swift庫找不到也可使用混編方式, 並且3到4.0變化也很少了,是時候嘗試開始Swift了

感謝各位賞臉

相關文章
相關標籤/搜索