本帖最后由 Simon21ic 于 2016-12-3 20:30 编辑
接触iOS的APP开发也只是这个月,花了一周的时间看完了Objective-C的所有语法,苹果的开发思想确实不错,不过Objective-C的语法吗。。。。用过的小伙伴应该都知道。现在自己用Objective-C也只是在开发一些tweak的时候用用,当然,比起APP开发,tweak是更加好玩的。
然后又花了一周时间看了一下swift,而且是最新版本的swift3.0,这个语法至少能够让我满意。
不过,苹果在swift3.0是,基本上对各个库都做了重构,从2.0的代码移植过去,那基本上很多调用都需要修改。看了一些修改的部分,也确实明白苹果的用意,代码、接口等更加规范化和统一化。很多时候,不用去查手册,看到函数的命令以及参数后,就知道是怎么用的了。当然,我也只是刚刚入门而已,这里随便举2个例子。当然,3.0的坑也不少,后面也会提一下
1. 更加接近自然语言,只要英文OK,看代码就大概知道用意
对比一些C代码:showPopMenu(itemArray, 2, 0, 0, ....)
对比swift:popMenu.show(itemArray, in: self.view, at: CGPoint(0, 0))
是不是swift的代码,用意一看就明白,in表示在哪个视图里显示,at表示在哪个点显示。当然,popMenu是我自己做的UI控件
2. 估计是因为Objective-C被吐槽太多,swift尽可能会让编译器做更多的事:
private var sortedGameCategory: [String]? {
get {
switch sortType: {
case .ByName:
return gameList.keys.sorted(by: <)
case .ByRating, .ByPrice:
return gameList.keys.sorted(by: >)
}
}
}
swift的语法中,允许省略很多编译器有能力自动识别的东西,这样可以让语法大大的简化
var removed = false
while ... {
if let index = gameList[category]?.index(where: {MMGames.shared.getGame(forID: $0.id) == nil}) {
removeGame(in: category, at: index)
removed = true
}
}
if removed {
table?.reloadData()
}
是不是代码一看就明白?而且语法也很简单?很多变量,都不需要是定类型,编译器看到我赋值false,就知道这个是Bool类型,where里的闭包,也是把能省的都省了
3. 安全性
上面代码里,即使table变量是nil,也不会出错,只要不是用table!强制转换。至少语法上,处处在提醒开发人员,这里要注意
当然,语言提供的安全性只是打辅助的,安全性还是看开发人员。
当然,swift 3.0还有很多并不让我满意的地方。
1. 兼容性差,做过2.0移植到3.0的人都会知道
当然,这个是苹果在3.0里整理各个库的代价,所以网上很多老的资料,都是不能用的
2. 库的完善度还不够,3.0去掉了很多功能,但是并没有提供明显的替代接口
当然,不仅仅是swift 3.0,老的swift的很多类,并没有提供Objective-C的同等类的接口。有时候需要用到的话,需要转换为Objective-C的类。
3. swift是开源的,但是库是不开源的,开发中碰到一些UI组件的问题,由于3.0改动很大,所以碰到问题的时候想查看一下库里是怎么实现的。不过,这些是看不到的。以前用Lazarus做UI的时候,直接可以看到UI库的代码,甚至可以调试,有BUG还能发到maillist。
当然,很多问题只是因为自己经验不够,不过这个APP也只是用了1周多时间就搞定了,目前正在准备上架。 |