时间的朋友2016 | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
今天看了罗振宇的《时间的朋友2016》跨年演讲,讲了未来的4只黑天鹅、商业机会,其实这些并不是什么黑天鹅,因为这是个方面的机会早就有人提出过,有的已经是现在大热门了。这四个方面有:时间战场,挖掘现有用户的消费潜力;服务升级,直接给用户超乎想象的优质服务;智能革命,算法不重要,大数据称王;认知迭代,创造认知,开辟新市场。
时间战场:互联网的人口红利已经消失,用户增长已经见顶,接下来的主要任务不再是拼命获取新用户,而是在现有用户的基础上深耕细作,深挖用户的消费潜力,让用户多掏钱。这一点的确会是将来的大趋势,2016年是个拐点。服务升级:相比目前的,用户喜欢什么,就给用户什么,像慈母多败儿式惯着用户,所以现在网络上这么low的内容,之后的机会是乔布斯的严父式给用户直接提供超乎他们想象的优质内容,用乔布斯的话来说,“用户根本不知道自己想要什么”,你直接用户提供优质的服务就好了,而不是在没得选的情况下,我选了劣质的服务,你就觉得我喜欢劣质的服务,然后给我提供更多劣质的服务。人工智能:算法不重要,大数据才是王道。目前人工智能的底层算法都已经开源,在底层算法通用的基础上,人工智能会成为大数据喂出来...阅读全文

 项目模块拆分总结 | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
确认模块的范围要将一个模块拆分出去,首先应该明确这个模块的范围,它应该包含哪些功能、组件,这样才能将一个模块真正有效地拆分出去。如果一个模块拆分出去的范围太小,包含的功能或者组件不完整,会导致无法有效地独立开发,这就失去了一个模块化的意义。而如果拆分出去的范围太大了,这样又会带来不必要的冗余代码,甚至影响主项目的开发。
如果在之前的项目开发中,就已经有了模块化的意识,有意识的将各个模块之间的文件进行隔离,那这一步就会非常轻松,否则模块的代码分散在各处,这时要来理清这些文件的关系会有不小的麻烦。
解耦发现依赖确认了一个模块的范围后,接下来最重要的一件事就是要把它和项目其它模块解耦,而要实现解耦,第一步就是找出它对项目中其它文件的依赖。
找依赖关系比较有效的一种方式就是写一个脚本,分析引入的头文件,找出既不属于本模块,又不属于第三方库的头文件,这样用脚本跑一遍就能找出所有用#import方式引入的外部头文件。
但这里有两个坑,因为我们项目中并不是所有的头文件都是通过#import方式引入的,有两种特例。
一种是是在oc文件中,通过Project-Swift.h文件引入的依赖,这个...阅读全文

 关于面向协议编程之协议扩展与动态、静态派发 | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
在Swift 2发布时,苹果将Swift定义为一门面向协议编程的语言,协议(Protocol)在Swift中被赋予了更加强大、灵活的功能。相比于Objective-C的协议,Swift的协议不仅可以被用做代理,也可以用作对接口的抽象,代码的复用。这里主要介绍下协议的扩展与协议的动态、静态派发。
面向协议编程在面向对象编程中,所有的功能都被封装在一个个对象中,而在面向协议编程中,功能是被定义在一个个协议中。比如吃东西,我首先要定义一个对象、比如人,然后提供一个吃东西的方法,如果我再创建一条狗,也有吃东西的动作,这个时候要么写分别写两套吃东西的代码,要么对人、狗进一步抽象,抽出更基础的动物基类,把吃东西的方法写在动物基类里,让人、狗继承自动物。
而面向协议编程则不同,我们只需要定义一个吃东西的协议,所有需要吃东西动作的类都遵循这个协议即可,不需要为了这一个动作而继承一个基类。这使得接口的定义更加灵活,轻便。同时通过协议扩展,我们可以为定义的接口提供默认现实,达到代码复用的目的。
打一个比喻,面向对象编程的继承像套娃娃,一层继承就是套一个娃娃,面向协议编程就像搭积木,一个个协议就是一个...阅读全文

 使用协议和结构体让一个view适配不同的布局 | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
在实际项目中,我们会碰到一个view需要有不同的布局样式的情况,这种情况,我们可能会分成几个view来写,或者在一个view中通过if...else..来适配不同的布局。前一种方式会造成代码浪费,后一种方式造成一堆if...else...,降低代码质量。在Swift中,通过使用协议和结构体,可以将一个view中的视图和布局功能解耦,让一个view可以便捷地使用不同的布局,一个布局可以便捷地运用到不同的view上。
假如我们现在有这样一个需求,需要在一个view上展示一段文字和一张图片,于是这个view就有一个UIImageView和一个UILabel,但是它有四种展示样式,分别是左字右图,左图右字,上图下字,上字下图。
首先我们创建一个枚举LayoutType:123456enum LayoutType {  case topImage  case leftImage  case bottomImage  case rightImage}
然后创建一个ContentView,它有一个UIImageView,一个UILabel,然后在sizeThatFits方法中计算size,在l...阅读全文

 Improving Swift Code Performance | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
显式和隐式性能优化只有当你发现了性能问题,并找到了原因之后,才应该开始做性能优化。
性能优化有两种类型:
显式的隐式的显式的性能优化直接指向低效的代码,这类优化通常要求对代码做重大的修改,比如换一种更加高效的算法。这通常会降低代码的可读性。使用更多的内存做缓存也能提高性能。
隐式的性能优化则需要借助语言特性来提高性能。它通常不需要对代码做重大修改,对代码可读性也没有负面影响,有时甚至能提高可读性。它被称为隐式是因为你能在代码的任何地方使用它,但过一段时间之后你又不会感觉到它的存在。
这里主要将探讨如何利用Swift的语言特性来做隐式的性能优化。
使用常量代替变量相比于变量,使用常量拥有更高的性能。因为常量能清晰地告诉编译器,这个变量的值将不会被改变,编译器就会对它做内联优化,并不会为它分配内存空间,这样既能节省内存空间,也能提高运行速度。
方法调用两种主要的方法调用类型:
静态: 静态方法绑定是指当你调用一个方法时,编译器知道你确实是在调用这个类的这个方法。动态: 动态方法绑定在方法和对象之间是一种弱绑定。当你调用一个对象的某个方法时,无法保证这个对象一定就能执行这个方法...阅读全文