CocoaPods
- CocoaPods是非常好用的第三方依赖管理工具。它于2011年发布,经过几年的发展,已经非常完善。CocoaPods支持项目中采用Objective-C或swift语言。CocoaPods会将第三方库的源代码编译为静态库.a文件或者动态框架.framework文件的形式,并将它们添加到项目中,建立依赖关系
Carthage
- Carthage是一个轻量级的项目依赖管理工具。Carthage主张"去中心化"和"非侵入性"。CocoaPods搭建了一个中心库,第三方库被收入到中心库,所以没有收录的第三方库是不能使用CocoaPods管理的,这就是所谓的"去中心化"思想。而Carthage没有这样的中心库,第三方基本上都是从Github或者私有git库中下载的,这就是"去中心化"。另外,CocoaPods下载第三方库后,会将其编译成静态链接库或者动态框架文件,这种做法会修改Xcode项目属性配置依赖关系,这就是所谓的"侵入性"。而Carthage下载成功后,会将第三方库编译为动态框架,由开发人员自己配置依赖关系,Carthage不会修改Xcode项目属性,这就是所谓的"非侵入性"。
- 使用brew安装carthage

- 创建cartfile文件(类似于podfile)
swift
$ touch cartfile

cartfile - Dependency origin
- Carthage支持两种类型的源,一个是github,另一个是git
- github表示依赖源,告诉Carthage去哪里下载文件。依赖源之后跟上要下载的库,格式为Username/ProjectName
- Git关键字后面跟的是资料库的地址,可以是远程的URL地址,使用git:// ,http:// ,ssh:// ,或者是本地资料库地址
cartfile - Dependency version
- 告诉Carthage使用哪个版本,这是可选的,不写默认使用最新版本
- == 1.0表示使用1.0版本
-
=1.0表示使用1.0或更高的版本
- ~>1.0表示使用版本1.0以上但是低于2.0的最新版本,如1.2,1.6
- branch名称/tag名称/commit名称,意思是使用特定的分支/标签/提交,比如可以是分支名master,也可以是提交5c8a74a
- carthage update
swift
$carthage update

- Cartfile.resolved文件和Carthage目录

Cartfile.resolved文件
- 这个文件是生成后的依赖关系以及各个库的版本号,不能修改
- Cartfile.resolved文件确保提交的项目可以使用完全相同的配置与方式运行启用。跟踪项目当前所用的依赖版本号,保持多端开发一致,出于这个原因,建议提交这个文件到版本控制中

Carthage目录
- Checkouts保存从git拉取的依赖库源文件
- Build包含编译后的文件,包含Mac与iOS对应的.framework

项目配置
- 项目Target->Build Setting->Search Paths->Framework Search Paths添加$(PROJECT_DIR)/Carthage/Build/iOS

- 项目Target->Build Phase->'+'->New Run Script Phase
- 添加脚本/usr/local/bin/Carthage copy-frameworks
- 添加"Input Files" $(SRCROOT)/Carthage/Build/iOS/Alamofire.framework

Swift Package Manager
- Swift Package Manager是苹果推出的用于管理分发swift代码的工具,可以用于创建使用swift库和可执行程序
- 能够通过命令快速创建library或者可执行的swift程序,能够跨平台使用,使开发出来的项目能够在不同平台上运行
- Xcode集成





项目整体结构
- 项目目录


主要页面


Model

R.swift在编译期起作用


UIColor Extension 和 便捷初始化

登录注册
- 面向协议编程

BaseViewController

Protocol + Extension

show Toast

Color生成Image

首页 + UITabbarController


轮播图

swift的协议允许类类型遵循,加 :AnyObject

Swift轮播图

无限轮播


自动滚动

- 手动拖动,定时器停止
Swift-UITableViewCell


详情页

简单富文本

个人中心页

商城订单列表页

- swift泛型抽象list中的cell以及item
关于学习
- 保持好学的心态,保持学习
- 只有改变是不变的
关于坚持
- 沉下心来研究
继续学习Swift
大前端
- 简单来说,大前端就是所有前端的统称,比如Android、iOS、web、Watch等,最接近用户那一层就是UI层,然后将其统一起来,就是大前端。大前端最大的特点在于一次开发,同时适用于所有平台,开发者不用为一个APP需要做Android和iOS两种模式而担心。大前端是web统一的时代,利用web不仅能开发出网站,更可以开发出手机端web应用和移动端应用程序。
跨平台
- H5+原生(Cordaova、Ionic、微信小程序)
- JaveScript开发+原生渲染(React Native、Weex、快应用)
- 自绘UI+原生(Flutter)
- 增强版Web App(PWA)
可选链
可选值的缺点
- 使用可选值有时会让人感到有点笨拙,所有的解包和检查会变得如此繁重,以至于会让你想要丢几个感叹号上去强制解包,好让你能继续工作下去。但是请小心:如果你强制解包一个没有值的可选值,你的代码就崩了。为了解决这个缺点,Swift引入两个特性,一是
合并空值运算符
,二是可选链
。
可选链
- 可选链是一个调用和查询可选属性、方法和下标的过程,它可能为nil。如果可选项包含值,属性、方法或者下标的调用成功;如果可选项是nil,属性、方法或者下标的调用会返回nil。多个查询可以链接在一起,如果链中任何一个节点是nil,那么整个链就会得体地失败。
可选链代替强制展开
- 你可以通过在你希望如果可选项为非nil就调用属性、方法或者脚本的可选值后边使用问号(?)来明确可选链。这和在可选值后放叹号(!)来强制展开它的值非常类似。主要的区别在于可选链会在可选项为nil时得体地失败,而强制展开则在可选项为nil时触发运行时错误
- 为了显示可选链可以在nil值上调用,可选链调用的结果一定是一个可选值,就算你查询的属性、方法或者下标返回的是非可选值。你可以使用这个可选项返回值来检查可选链调用是成功(返回的可选项包含值),还是由于链中出现了nil而导致没有成功(返回的可选值是nil)
- 另外,可选链调用的结果与期望的返回值类型相同,只是包装成了可选项。通常返回Int的属性通过可选链后会返回一个Int?.


为可选链定义模型类

通过可选链访问属性

通过可选链访问属性

通过可选链嗲用方法
- 函数和方法没有返回类型就隐式地指明为Void类型。意思是说他们返回一个()的值或者是一个空的元组。

通过可选链调用方法
- 如果你尝试通过可选链来设置属性也是一样的。上边通过可选链访问属性中的例子尝试设置address值给john.residence,就算是residence属性是nil也行。任何通过可选链设置属性的尝试都会返回一个Void?类型值,它允许你与nil比较来检查属性是否设置成功;

通过可选链访问下标
- 通过可选链访问下标你可以使用可选链来给可选项下标取回或设置值,并且检查下标的调用是否成功。

链的多层连接
- 你可以通过连接多个可选链来在模型中深入访问属性、方法以及下标。总之,多层可选链不会给返回的值添加多层的可选性
也就是说:
- 如果你访问的值不是可选项,它会因为可选链而变成可选项
- 如果你访问的值已经是可选的,它不会因为可选链而变得更加可选
因此:
- 如果你尝试通过可选链取回一个Int值,就一定会返回Int?,不论通过了多少层的可选链
- 类似地,如果你尝试通过可选链访问Int?值,Int?一定就是返回的类型,无论通过了多少层的可选链。
用可选返回值链接方法
- 可以通过可选链来调用返回可选类型的方法,并且如果需要的话可以继续对方法的返回值进行链接

KVC
- 从Swift4开始,类和struct都支持KVC
- 继承自NSObject的类,标记为@objc的属性可以使用setValue(_:forKey)
- 非继承自NSObject的类和结构体,使用索引+参数值
KVC-索引+参数名


KVO
- 只有NSObject才能支持KVO
- 要观察的属性必须使用@objc dynamic修饰

面试看什么
- 你现在的能力
- 你将来的潜力
- Array & Set
- 区别
- 怎么实现一个Array->存储->添加删除怎么做->怎么优化->Ring buffer
- 怎么实现一个Set->Hash存储->Hash算法->Hash冲突解决
- Array算法->排序/查找/乱序/LCS/.....
- Set算法->子集/位运算/OrderedSet