Skip to content

Instantly share code, notes, and snippets.

@supersheep
Last active June 27, 2018 14:02
Show Gist options
  • Save supersheep/ed037350cb0c1ad55e09e1530c89a0d5 to your computer and use it in GitHub Desktop.
Save supersheep/ed037350cb0c1ad55e09e1530c89a0d5 to your computer and use it in GitHub Desktop.

今年国内首届Swift大会在北京举行,Swift是苹果2014年7月推出的新编程语言,从许多现代语言中吸收了不少非常棒的特性。

北京这次完全是坊间出于技术交流与分享的热情组织起来的非盈利性会议,请到了来自国内外的多位技术大咖,有同学戏称是iOS界网红见面会,总之非常难得。

议程结束不久,趁着还热乎,在此先与大家分享一下。回头官方放出视频和Keynotes再做补充。

Programming with Structs

by Chris Eidhof

Chris是objc.io和UIKonf的创办者,objc.io上每一阵会关于一个issue邀请各路好手来聊聊最佳实践,翻阅一遍会很有收获。 这次要分享的是struct在swift中的新可能性。作为值类型,你没有办法像普通对象那样,改变其属性而不影响对象本身的引用。 相反,改变struct嵌套对象中的值会使整个struct变成完全不同的东西。基于此,我们就可以利用swift提供的didSet钩子来做一些有意思的事情。

随后Chris举了一个例子,做一个包含Nest Data Structure的小应用,实现数据持久化的功能。 先使用传统的Class风格写了好几个类,把NSUserDefault作为参数传给构造器,再在内部的save方法中做持久化。 Chris指出这么做的缺点在于数据结构强依赖于NSUserDefault,对测试不友好,遂把他改为了一个自定义的Storage Prototol,这样就可以在测试中做Mock了。

由于swift的struct可以包含方法,所以可以直接用来替换class。定义好init和serialize方法来做dictionary和struct的互转,剥离掉对Storage的依赖, 而通过一开始提到的值类型的特点,在最上层做持久化的工作。这样一来对模型的定义就变得非常的干净,强迫症患者还可以考虑用extension来切割属性和方法。

FAQ环节,Chris表示大家拿中文提问也没关系,反正有人翻译的,不过大家出于对国际友人的尊重还是一个个硬着头皮用英文问了。问题集中在是否推荐用struct全盘替代class,作为值类型,对象属性一多在拷贝的时候会否有性能问题。 Chris表示要讲细节我可以给你讲两天,不过大体来讲苹果优化得挺好,只会对必要的变更进行拷贝,所以使用上没太大差别。另外今天的分享也是聊一聊可能性,并没有要强行安利的意思。主持人总结说大家结识新朋友勿忘老朋友。

越过 OC 与 Swift 间的鸿沟

by 傅若愚

若愚是ThoughtWorks的高级咨询师,也是SwiftyJSON的作者。一上来自然是宣传一下私货,让大家多去Github贡献几个star。话题主要是讲Objective-C和Swift一些风格上的区别,以及迁移过程中思维模式的转换。 开场先上了一个例子

someArray = [1,2,3]

var result = someArray.map({"No. \($0)"})

result = someArray.map({"No. \($0)"})  

这样一段代码,在playground中执行的时候会有不同的结果,取决于someArray是定义为[Int]还是[Int]?,开发者在享受带来便利的时候也需要更清楚自己在做什么。 从OC到swift的过程中,因为原先动态的一些特性没了,所以原先用NSProxy或者method swizzling来实现的一些黑科技现在用不了了。 然后聊了一下设计模式,强烈不建议大家用继承,罗列了继承的诸多罪证,比如隐式的共享可能会带来的冗余或非预期行为。在swift的环境下,还会有子类和父类的类型转换带来的性能消耗以及类型安全的保护。 其实组合优于继承之类其实也都是老生常谈了,不过对于OC来讲很多场景下并没有特别合适的替代。而Swift的Prototol有了可以带默认方法实现这一特性之后基本就很舒心了。

讲完大道理,若愚展示了一下怎么用Swift来表达JSON以及如何处理异步回调造成的callback hell。都是简短的小例子,然而很见功底

第一个问题可以很方便的用enum来解

enum JSON{  
    case JArray([JSON])
    case JObject([String:JSON])
    case JString(String)
    case JNumber(Double)
    case JBool(Bool)
    case JNull
}

第二个问题JS圈子里也算是老问题了,在Swift的世界里可以通过巧妙的配合范型定义struct与enum,来让代码变得更简洁可读。

Swift Style

by Greg Heo

Greg Heo是多伦多的iOS自由开发者,同时也为raywenderlich.com的撰稿,并录制视频。作为一名亚裔,之前刚和主办方碰头的时候还被误以为会讲中文。 这次他讲的是Swift的编程风格,顺带开了下玩笑说代码是写给人看的,不会有必要像js一样压缩成一坨。 议题主要讨论了以下几点 - Swift更强大简练的语法(比如可以省略一些非必要的语法元素) - 更强大的值类型,以及值类型的特点 - 利用标准库所提供的Protocol来写出更可读的代码 (Equatable, Comparable, StringLiteralConvertible 等等。 - 类型安全,关于 if-let、guard、precondition fail, assertion, faltalError()的使用,语言本身提供这些,可以避免冗长的if-else,来更简单的对代码进行保护

提问环节Chris问到Greg这一年半以来的编程风格的改变,Greg表示guard用得多了,并且安全意识上去之后,回去写oc的时候也会做很多nil check

Swift 中的面向协议编程

by 李洁信

下午场。洁信是前网易新闻客户端iOS开发,创办了swiftist.org社区。讲的主题是Protocol,和早上议题中的一些部分有所重合,也有新东西。 Struct和Protocol是Swift世界里推荐的元素,标准库里面大部分都是使用这两者来完成的。 Struct除了数据类型与Class不同(Value vs Reference),无法继承之外,支持Properties,Methods和Protocol,使用上已经能应对许多场景。 Protocol现在可以用于class,struct和enum,可以继承、扩展、组合。 标准库提供的Protocol可以方便的对语言进行扩展,比如利用StringLiteralConvertible,可以做到直接把json字符串赋值给模型之类的事情。 随后举了经典的"BaseViewController"的例子,介绍了在swift下如何用Protocol的组合让代码变得松耦合,使得整个的开发体验更像搭积木

如何打造一个让人愉快的框架

by 王巍

喵神表示被安排在下午这个令人犯困的时候,就是让他来活跃活跃气氛的。说自己半年以来都没什么长进,光顾着带孩子了,所以要讲topic第一个想到的就是”如何打造一个令人愉快的小孩“,结果被K了,当然这是一个段子。 真正的主题关于框架的开发。讲了以下几个方面

iOS中框架使用和开发的历史,对比了系统库和框架的区别。iOS8以后开放了动态库所带来的改变; 主流包管理工具的设计思路和使用方式。 设计框架时候的一些原则,包括遵循官方建议的naming方式,良好的API设计,内部资源bundle等 如何发布框架,使用工具来自动化框架的发布过程,安利了Fastlane这个工具,并且强烈建议大家看看AFNetworking的Fastlane文件 成就一个框架的关键点:完善的文档、注释、测试、更新日志、issue响应等(想起了node模块README里的各种badge) 开发中应当注意避免的问题,重复包含,依赖冲突(推荐在依赖中使用更宽松的版本号)

Swift 函数式编程实践

by 包涵卿

瀑布IM客户端技术负责人包涵卿这次带来的是函数式编程,讲编程范式的改变关乎思考模式。前面介绍的Mapping和Curry不难理解,后面提到的Monad就偏学术了,可能没接触过的人无法很快接受。 当然如果做过前端开发,这些概念应该并不陌生。Curry就是高阶函数,而ES6新引入的Promise其实就是一种Monad。Monad是这么一种模式:接受一个值,对其进行求值,再返回一个同样的东西,是不是和Promise很像。

Swift,改善既有代码的设计

by 翁阳

沪江网的资深工程师这次以一个比较糟糕的代码为起点,给大家展示了一下代码重构之道。原先的代码包含数据和ui逻辑,并且嵌套一层套一层。翁阳提到了以下这些技术来改善代码的可维护性。

Split code DRY (Don't Repeat Yourself) 函数内部嵌套函数 自定义操作符 提取高阶函数 OCP(开放扩展,闭合修改) 提炼基础接口 解耦 UI 与数据的依赖 (subscript) 最后看着重构完成的代码,叹了口气表示,团队如果整体跟不上,实际上大家对代码的认知度是下降了的。 大一点的团队就是会遇到这样的问题,先行者要做的就是选择合适团队综合实力的方式,并不断的做布道。个人感觉一些优化更多的是出于洁癖和炫技,对于代码的可维护性其实没有太大的提升。 最后翁阳提了一个很有禅意的观点:优良的设计是从无到有再从有到无的。

Faster App,用 Swift 打造一款流畅的 App

by 周楷雯

Kevin的Slide里面干货很多,并且是今天唯一一个除了语言之外还讲了系统API使用以及优化的议题。 话题包含了

Autolayout一些注意点(比如CollectionView会有隐性的动画会影响性能,需要关闭掉) 文字排版的多重可选方案以及步骤 通过贝塞尔曲线配合NSParagraphStyle来绘制UI并转成图片并缓存,来提高UI流畅性的技术 多媒体实时渲染的方案与步骤 动画优化方案 数据库上CoreData vs Realm (基本对比下来是Realm完胜) 做网络操作时候需要做的优化 (ETAG,Cache-Control,Gzip,这部分web开发者就耳熟能详了) 不过他手机重设密码之后自己断片想不起来了,急着去刷机,于是讲得比较快,像多媒体这块内容,没有接触过比较难消化,不过后续会专门撰文展开,期待一下。

Q&A的时候有同学问到,这些资料都是从哪里获得的。Kevin表示好多个夜晚想着自己怎么就不够牛逼呢,于是就坐下来看官方文档,就当是看言情小说了。

后记

这次大会首次举办,主办方也表示本来想再加一些workshop,办成两天的会议,不过先mvp吧。与会者中有1/3的同学已经开始在公司的项目中使用Swift(当然也包括我们啦)。有3/4的来自非北京地区,最远的都有从新疆赶来的,除去喵神的娃,年纪最小的参会者是97年的,后生可畏啊。来年的举办地点还在考虑中,不过现场上海的呼声还挺高的,期待。

最后附上主办方提供的议程资料: https://github.com/atConf/atswift-2016-resources

PS:票牛正在寻找富有热情的iOS和前端小伙伴,有意者欢迎联系致信件 hr@ipiaoniu.com 或者通过微信:spudhsu 联系我。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment