为什么建议iOS开发使用Swift
文章目录
- swift发展趋势
- 强大的背景
- 语言排行榜
- Swift优势
- 优势一:更快
- 优势二:安全
- 优势三:更具表达性
- 优势四:代码量大大减少
- 优势五:降低交叉Review成本
- 参考
- Swift目前已经形成了一个 完善的Apple开发生态,苹果也是发力推这个,
- 而且从语言的排行榜也可以看出,swift一直在网上走,
- 而且swift使用时效率更快,
- 并且更加安全,因为每一个输入都有一个明确的类型,很少导致对象类型不符的crash,
- 然后就是更具表达性,就是用很少的代码表达一段完整的逻辑,通过struct和enum类型可以实现这些功能,例如:同时传入的值同时遵循多个协议,Swift可以直接用&实现,而OC需要额外定义一个协议遵守另外的多个协议来处理,
- 同时 Swift代码量明显减少,可读性更强。
- 他的语法和安卓的Kotlin很像,我们双端如果是通过Swift+kotlin实现的话,可以很轻松的进行交叉review
毫无疑问,Swift是大势所趋,我认为,相比于OC,Swift更适用于未来
swift发展趋势
强大的背景
从 Chris Lattner 开始设计 Swift 到现在已经十年过去了,每年都有逐渐完善。现在已经成为了构成了一个特别玩完善的Apple开发生态,期间,WWDC对外输出的内容近百。
语言排行榜
首先通过 TIOBE排行榜,我们就可以了解到,swift现在的受欢迎程度,一直都是上升趋势,现在已经排名第10名,而OC已经排在 20 名之外了。
从社区的语言排行榜来看,虽然乍一看,感觉还是 Swift 和 Objective-C 共存的大环境,但其实背后也反映出,Swift 已经被大部分开发者所接受了。
Swift优势
优势一:更快
Swift再执行效率上边做了很多优化,比如:系统库有很多不需要引用计数的基础类型,
优势二:安全
所谓的安全
不等于不发生Crash, 而是指任何的输入都有一个比较明确的表现定义, Swift 是一门类型安全的语言。鼓励程序员在代码中清楚明确值的类型。如果代码中使 用一个字符串 String,那么你不能错误地传递一个整型 Int 给它。因为 Swift 是类型安 全的,它会在代码编译的时候做类型检查,并且把所有不匹配的类型作为一个错误标记 出来。这样使得程序员在开发中尽可能早地发现和修正错误。
而 Objective-C 则不然,你声明一个 NSString 变量,仍然可以传一个 NSNumber 给 它,尽管编译器会抱怨,但是你仍然可以作为 NSNumber 来使用它。
由于我司最新代码使用了Swift,所以在平时的代码review中,对于这种类型错误可以节省人力,而且在后期的crash率,有很大的降低。
优势三:更具表达性
更具表达性就是说用更少的代码表达一段完整的逻辑, 整体来说,Swift的代码量比OC少了大概 30% - 50%。下方链接有很多增强Swift的表达式,可以参考。https://apple.github.io/swift-evolution/
Builder Pattern
我们定义了很多属性的复杂model时,不想这个model的属性在初始化之后被改变,我们就需要通过建造者模式来解决,代码如下:
// OCHMGModelBuilder.h
@interface OCHMGModelBuilder : NSObject@property (nonatomic, nonnull) NSString *one;
@property (nonatomic, nonnull) NSString *two;
@property (nonatomic, nonnull) NSString *three;
@property (nonatomic, nonnull) NSString *four;
@property (nonatomic, nonnull) NSString *five;
@property (nonatomic, nonnull) NSString *six;
@property (nonatomic, nonnull) NSString *seven;
@property (nonatomic, nonnull) NSString *eight;
@property (nonatomic, nonnull) NSString *nine;
@property (nonatomic, nonnull) NSString *ten;@end// OCHMGModelBuilder.m
@implementation OCHMGModelBuilder- (instancetype)init {if (self = [super init]) {_one = @"one";_two = @"two";_three = @"three";_four = @"four";_five = @"five";_six = @"six";_seven = @"seven";_eight = @"eight";_nine = @"nine";_ten = @"ten";}return self;
}@end// OCHMGDemo.h
@interface OCHMGDemo : NSObject@property (nonatomic, readonly, nonnull) NSString *one;
@property (nonatomic, readonly, nonnull) NSString *two;
@property (nonatomic, readonly, nonnull) NSString *three;
@property (nonatomic, readonly, nonnull) NSString *four;
@property (nonatomic, readonly, nonnull) NSString *five;
@property (nonatomic, readonly, nonnull) NSString *six;
@property (nonatomic, readonly, nonnull) NSString *seven;
@property (nonatomic, readonly, nonnull) NSString *eight;
@property (nonatomic, readonly, nonnull) NSString *nine;
@property (nonatomic, readonly, nonnull) NSString *ten;- (instancetype)initWithBuilder:(void(^)(OCHMGModelBuilder *builder))builderBlock;@end// OCHMGDemo.m
@implementation OCHMGDemo- (instancetype)initWithBuilder:(void (^)(OCHMGModelBuilder * _Nonnull))builderBlock {if (self = [super init]) {OCHMGModelBuilder *builder = [[OCHMGModelBuilder alloc] init];if (builderBlock) {builderBlock(builder);}_one = builder.one;_two = builder.two;_three = builder.three;_four = builder.four;_five = builder.five;_six = builder.six;_seven = builder.seven;_eight = builder.eight;_nine = builder.nine;_ten = builder.ten;}return self;
}@end//ViewController.m 中使用
@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];OCHMGDemo *demo = [[OCHMGDemo alloc] initWithBuilder:^(OCHMGModelBuilder * _Nonnull builder) {builder.two = @"外面修改的Two";}];// demo = one、外面修改的Two、three、four、five、six...ten
}@end
但是Swift的struct支持属性的默认初始值和初始化构造器,使得上方的构造器意义不大,如下:
struct SwiftHMGDemo {var one = "one"var two = "two"var three = "three"var four = "four"var five = "five"var six = "six"var seven = "seven"var eight = "eight"var nine = "nine"var ten = "ten"
}// 使用
func use() {let swiftDemo = SwiftHMGDemo(two: "外面修改的Two")
}// swiftDemo = one、外面修改的Two、three、four、five、six...ten
Facade Pattern
当我们定义了一个方法需要传入的属性,该属性符合多个协议类型的时候,我们就用Facade Pattern来解决。
例如我们有四个协议 JSONDecodable
、JSONEncodable
、XMLDecodable
、XMLEncodable
以及一带有两个入参的方法,入参 1 为 json 要求同时满足 JSONDecodable
、JSONEncodable
两个协议,入参 2 为 xml 同时满足 XMLDecodable
、XMLEncodable
。当我们使用 OC 来解决问题时通常会这么写
@protocol JSONDecodable <NSObject>
@end@protocol JSONEncodable <NSObject>
@end@protocol XMLDecodable <NSObject>
@end@protocol XMLEncodable <NSObject>
@end@protocol JSONCodable <JSONDecodable, JSONEncodable>
@end@protocol XMLCodable <XMLDecodable, XMLEncodable>
@end- (void)decodeJSON:(id<JSONCodable>)json xml:(id<XMLCodable>)xml {}
可以看出,我们是额外定义了两个协议 JSONCodable
,XMLCodable
来解决的问题,但是在Swift中,我们可以使用&来解决这个问题,不需要定义额外的类型:
protocol JSONDecodable {}
protocol JSONEncodable {}
protocol XMLDecodable {}
protocol XMLEncodable {}func decode(json: JSONDecodable & JSONEncodable, xml: XMLDecodable & XMLEncodable) {}
上方就是介绍了 为什么Swift更具表达式。
优势四:代码量大大减少
Swift代码量减少,投入的人力也会减少,整体会提效。
优势五:降低交叉Review成本
由于Android的Kotlin和iOS的Swift语法十分相似,那么在review代码的时候,安卓的和iOS的可以互相review,这样的话能够更加保证代码的质量。那么这种交叉review会给整个团队带来非常大的收益。
参考
https://mp.weixin.qq.com/s?__biz=MzA5MTM1NTc2Ng
https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ
https://apple.github.io/swift-evolution/
https://swiftperformance.com/
https://developer.apple.com/videos/play/wwdc2016/416/
为什么建议iOS开发使用Swift相关推荐
- [共享]iOS开发系列--Swift语言
2019独角兽企业重金招聘Python工程师标准>>> iOS开发系列--Swift语言 概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- IOS开发语言Swift入门连载---类型转换
IOS开发语言Swift入门连载-类型转换 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 类型转换在 Swift 中使用is 和 as 操作符实现.这两个操作符提供了一种简单达 ...
- ios开发视频 Swift开发视频教程完整版下载
Swift ios开发视频教程完整版下载(共四季) --下载地址 Swift代码语言教程简介: 在刚刚过去的WWDC2014大会上,苹果公司新发布了一种编程语言Swift.据悉,Swift语言继承了C ...
- IOS开发语言Swift入门连载---基础部分
Swift >是 > iOS > 和 >OS X >应用开发的一门新语言.然而,如果你有 > C > 或者 > Objective-C > 开发经 ...
- IOS开发【Swift编程语言】
初识 学习mac电脑的使用 下载app appstore: 通过网页下载(安装只需要将软件图标拖动到资料夹). 移除app Finder->应用程式[拖动到右下角的垃圾桶即可] 滑鼠.触控板 滑 ...
- 【iOS开发】swift 3.0 延长设置launch image启动页面图片显示时间
在ViewController.swift里面的viewDidLoad方法中添加代码(3.0为秒数,可自定义): override func viewDidLoad() {super.viewDidL ...
- iOS开发(swift):UI界面
# swift bounds和frame区别 # 参考资料:https://blog.csdn.net/chenyufeng1991/article/details/51764303 -- frame ...
- IOS开发语言Swift入门连载---基本运算符
运算符是检查.改变.合并值的特殊符号或短语.例如,加号+ 将两个数相加(如let i = 1 + 2 ).复杂些的运算例如逻辑与运算符&& (如if enteredDoorCode & ...
最新文章
- Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站
- 腾讯发布AR导航,“生态+技术”驱动下一代智能座舱体验跃迁
- 210328卡式水分开阶段总结
- Why Vector Clock are Easy or Hard?
- 如何解决secureCRT里面的The remote system refused the connection.
- jquery插件dataTables自增序号。
- innobackupex备份工具
- golang解析IP到城市jsonRPC服务教程
- 自动化测试之Appium模拟机测试
- 中山大学计算机线性代数第六版答案,中山大学2013线性代数第二次作业
- 消息: Automation 服务器不能创建对象
- 生物信息学常用的在线网站及数据库汇总
- 【CSDN软件工程师能力认证学习精选】十分详细的React入门实例
- 快收下这枚 Scrapy Requests 口味的爬虫“回魂丹”
- 分治法--处理数列问题
- 手机刷机是什么意思?快速了解手机刷机基本概念
- 区分阿里云系统盘和数据盘
- originPro将坐标以百分比的方式显示
- 洛谷 1498 南蛮图腾
- Mondrian + JPivot环境配置和演示