SwiftCon 期待与失望并存

2016 年 1 月在北京举行的 @Swift 中国首届 Swift 开发者大会的录像视频才刚刚学习过,所以我对这次交流会议也多了几分期待。 SwiftCon Think 技术社区主办,总共安排了 11 场分享,相较 @Swift 的 8 场,至少内容上应该是满满的。从我参会的感觉上来说,其中 5 个主题还是不错的。主要的日程如下表:

When What Who
09:30 - 10:15 @ Apr 23 一个 Swift 项目的网络层变迁 陈乘方
10:30 - 11:15 @ Apr 23 Objective-C 和 Swift 的跨平台开发 郝培强
11:30 - 12:15 @ Apr 23 逆向工程:从 Objective-C 到 Swift 包涵卿 👍
14:00 - 14:45 @ Apr 23 拥抱 Swift 3.0 与未来展望 图拉鼎 👍
15:15 - 16:00 @ Apr 23 从数学函数角度理解函数式编程 丁峰
16:15 - 17:00 @ Apr 23 Swift 语言的设计取舍及跨语言调用 董一凡
09:30 - 10:15 @ Apr 24 Swift 设计模式 曾伟
10:30 - 11:15 @ Apr 24 Redux in Swift - 新一代的 iOS 应用架构 方志刚 👍
11:30 - 12:15 @ Apr 24 Asynchronous Programming in Swift, Swift 异步编程 刘冠杉
14:00 - 14:45 @ Apr 24 读 Swift 源码,理解 Monad 唐巧 👍
15:15 - 16:00 @ Apr 24 How to parse float numbers - the really hard way 傅若愚 👍

一些关于背景的八卦

干货之前先来认识一下他们是谁,有啥背景,做过点啥:

  • 陈乘方,来自 ENJOY ,iOS 负责人。搜了一下只是大概知道,他曾在 MDCC 2015 中国移动开发者大会,发表了题为 “Let’s ENJOY Swift” 的主题演讲。去 App Store 看了下他家的应用,小而美,非常棒。他的 Github 里有个叫做 xcode_shell 的高星项目,大概看了下是一个自动化打包的工具。

  • 郝培强,来自上海泰尼网络科技公司,CEO,他为大家熟悉的名字是 Tinyfool 。他也写公众号,但是很遗憾我并没有看过。他家的公司网站已经不能访问了,因为是已经倒闭了,以至于我不能比较官方的渠道知道他们公司是具体做什么的。后来翻了翻别的搜索引擎,大概是做过一个应用推荐的平台,但是我也没有听过,这么一说真的挺惨的。

  • 包涵卿,来自瀑布 IM 的客户端技术负责人。前 PPTV 趣点项目 iOS 负责人,曾经独自开发 PPTV Mac 版 ,看了一眼人家的 Github,似乎没有什么特别高星的开源作品。在今年的 @Swift 上他的选题是 “Swift 函数式编程实践”。

  • 图拉鼎,一名独立 iOS / Mac 开发者, ENJOY 的兼职开发者,不过他是远程工作的(最近按他的微博已经离职了)。他自己开发的项目有奇点 for 微博,一款收费的第三方iOS 微博客户端,$2.99 ;Manico,一款快速启动和切换 App 的 OS X 工具,$3.99 ,内购激活。

  • 丁峰,来自又拍云的 API 组移动开发工程师。没有别的更多的资料。

  • 董一凡,现为自由职业者,多平台开发者,之前在 Autodesk 数字艺术部门任职,负责过 Autodesk SketchBook,一款多平台的绘图软件。

  • 曾伟,即我所熟悉的老郑,我的 iOS 入门当时就是看他的《豆瓣电台》系列视频,启蒙导师之一。

  • 方志刚,来自 ThoughtWorks 的咨询师,多平台开发者。看背景似乎平淡无奇,但实际上人家是带着 PlayGround 来的,而不是 PPT ,着实让人感觉眼前一亮。

  • 刘冠杉,来自阿里音乐的 iOS 工程师,负责天天动听虾米音乐。目前是 CocoaHeads Shanghai Meetup 的组织者。翻到了人家的 Github,似乎也没有什么特别的。

  • 唐巧, InfoQ 编辑,来自猿题库,旗下作品有猿题库猿辅导小猿搜题,涵盖了自主学习,真人在线辅导及作业答案一拍即得。如果我再晚几年念书,估计会是小猿搜题的重度用户。我对面的桌子上就摆着他的书《 iOS 开发进阶》

  • 傅若愚,ThoughtWorks 高级咨询师,iOS 开发者。最著名的作品莫属 SwiftyJSON ,出来的早,用的人也多。别的似乎就没有什么特别高星的开源项目了,他的 Github。在今年的 @Swift 上他的选题是 “越过 OC 与 Swift 间的鸿沟”。

其实有头有脸的人物还不少,下面进入正题。

一个 Swift 项目的网络层变迁

讲述了一个从 Objective-C 项目迁移到 Swift 项目的心路历程,每一个从 Objective-C 迁移过来的开发者,开始时还是仅停留在直译地状态,并不够 Swift-style。而从实际的架构上看,他们大体上的进度和我们相比,还停留在我们引入 MVVM 架构之前模式。但其中有一个观点我觉得值得商榷:

  • 尽可能减少 Model 中带有 Optional 的属性

个人觉得,Model 中的各个属性是否可为 Optional 完全由业务逻辑控制,很多参数都是产品经理说的,有就显示,没有就留空。如果是不一定存在的参数,那 Optional 则是一种很优雅的匹配方案,反之,则尽量为非 Optional 的属性。那如何确保 JSON -> Model ,也就是从服务器获取的响应呢?只要使用 JSON -> Model? 即可。对一切无法正常编码( Decode )的数据,直接返回 nil 。这里再加一步 if let 可选绑定,就能直接返回 [Model] 了。这样一旦服务器有任何异常返回了不该为空的属性,对客户端而言知识一个网络异常的错误而已。

Objective-C 和 Swift 的跨平台开

这场基本和这个题目没有什么联系,纯粹是 Tinyfool 在和他的两个下属讲相声,而且是一个碾压另两个的那种,而场下骂声一片,连要退款的都有。不过现在会想一下,虽然与技术无关,但有两点他是说对了:

  • 程序员大多不会讲话,场上那两个就是活脱脱的例子
  • 程序员内部存在严重的鄙视:对新手的鄙视和对女生的鄙视

逆向工程:从 Objective-C 到 Swift

这一场干货满满,两个相同结构的简单 TableView 单视图应用,分别用 Objective-C 和 Swift 编写,从逆向分析的结果来看两种语言设计及最终实现上的不同。上来就是一堆汇编的入门,可惜不是很明白。

拥抱 Swift 3.0 与未来展望

事实上 Xcode 7.3 已经为我们带来了 Swift 2.2 ,项目中的 Swift 代码比例不少,所以当时也是改了半天。不过这也总比一次性完成过度好。

从数学函数角度理解函数式编程

函数式编程还是推荐看 Objc 的书《函数式 Swift 》喵神做了中文译本,很不错,如果你还没看过,赶紧入手吧。

Swift 语言的设计取舍及跨语言调用

  • 值类型的大量使用
  • 面向协议的编程
  • 方法名的简化

Swift 设计模式

老镇的视频做的不错,其实备课也不错,有 10000+ 的讲义备注。但是,这里并不是你的视频所面相的小白,而且你也没有再次剪辑的机会,所以,是吃力不讨好。但是作为入门导师之一,我还是得说,二十一种设计模式不错,武侠形式新颖,下次有个重点就更好了!

Redux in Swift - 新一代的 iOS 应用架构

第一次知道了可以用 Playground + Git 的版本控制来现场撸代码,而且由于 Playground 的即时性,运行结果也一目了然。

ReSwift ,由 ReduxKit 演进而来。一种 MPV 结构的应用架构。即可以保存应用数据的各个阶段,类似于 Apple Watch 上的时光旅行。同时也可以很方便的回放应用 Crash 时的完整状态。但是学习曲线较高,一旦遇到大量异步的问题会比较头疼。

Asynchronous Programming in Swift, Swift 异步编程

实际上用了 RxSwift / ReactiveCocoa 等框架后异步编程已经大大简化。完成耗时操作完成后发出信号,观察者监听信号并进行下一步操作,好像就是这样一回事。

读 Swift 源码,理解 Monad

Monad,单元 (unit) 的拉丁语,来自范畴论的一种技术,其已经被采用作为处理在功能性程序设计语言中状态的一种方式,其使用 monads 来构建包含必须以特定顺序来执行的操作程序。Monads 在功能性程序设计中的主要应用是表达输入/输出和改变状态而不使用带来副作用的语言。一个 monad 由三部分组成:增加一个现有类型的意思,从原始类型的值中创建一个新类型默认值的意思,和对与新的类型一起工作的旧的类型的基本应用程序操作符的一个替代。以上来自 Google 但说实话并不能很好的理解。

犹然还记得唐巧发的 Swift 烧脑体操,这回还是继续 Optinal 的问题。讲义非常的常 map flatMap 各种起飞。

How to parse float numbers - the really hard way

继续讲 Monad ,但究竟什么是 Monad ,反正我还是没有听明白。后来看了这篇《图解 Monad 》,才似乎恍然大悟。

就 Optinal 而言,它实质上是一种泛型的枚举,即他是对 T 这个原始值的封装:

1
2
3
4
enum Optinal<T> {
case Some(T)
case None
}

举个例子,一个 IntInt? 是不能够直接相加的,好比 Int 是一个值, 而 Optinal<Int> 是一个装在 Optinal 箱子里的值,值相加必须两边的类型相同,即必需把箱子打开,取出里面的值,再进行加操作,最后根据需要,把结果放回箱子里。这就是 Monad 。