先上一个码云地址 码云地址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了
感谢各位赏脸