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了

感谢各位赏脸

相关文章
相关标签/搜索