您的位置:首页 > 移动开发 > Swift

iOS Swift4项目EFarm学习和总结

2017-09-22 00:00 330 查看
摘要: 这个项目是Swift 零基础开始, 所以有大量的Swift基础语法介绍, 除此之外也会包含一些封装的示例, MVVM的用法, 同时也包含项目优化的理解和看法

Swift项目

先上一个码云地址
码云地址

项目的简单介绍

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项目模板

第一个swift类
在从github和码云上浏览了几个Swift项目之后我开始了自己的尝试.

例如 翔妖除魔 / ZhiHuDaily-Swift

例如 LinXunFeng / LXFWeChat

开始动手时候却发现Swift和OC很是不一样, 不知道swift的成员变量怎么"声明", oc中常用的类别, 类方法成员方法等等

1. Swift变量

参考资料关于Swift 你可能连变量都不会定义

swift变量有两种类型 : 存储变量 和 计算变量

存储变量

用于给一个对象增加属性, 可以在创建的时候就赋值(table)

// 例如某个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

其他一些项目建议:

反朴归真,使用系统的nav或tab,体检更好

使用wkwebview代替uiwebview,体验更好

简单适配3dtouch, peek/pop让你的项目体验更好

TableView优化

起因手机更新iOS11之后发现首页tab滑动更加卡了, 于是查看了头条, 腾讯视频都发现好像确实没有10流畅.

然后发现系统设置的table也卡出了翔(iOS11.0的iPhone 设置->移动蜂窝网络), 苹果生动的当了一次反面教材.

cell高度预先计算

cell使用不同identifier, cellForRow应该只有一个赋值操作

特别复杂, 没法使用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了

感谢各位赏脸😄
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Swift IPhone X iOS 11