iOneWay Blog

天道地道,自求我道

QQ:373850874. 欢迎加入。


Swift 最佳实践(一)

Swift已经问世有一段时间了,各种优秀的第三方库都陆续出现,以及学习网站都加大了对Swift的推广力度,就连一向傲慢的苹果也为推广Swift专门设立了一个Bolg。还有不少大神都发文看好Swift发展。所以为了适应未来,学习Swift迫在眉睫。

最近看了一个swift项目:CollapsableTable-Swift-master,我已经找不到是从哪里下载的了,为了能够永久保存,不至于误删除,我copy了一份放在了我的百度云中,分享给大家:http://pan.baidu.com/s/1nux5IaP

在项目中学习到了一些Swift编写方法和要点。

1, 对于一个只申明了方法的protocol,class最好在extention中实现该协议,实现该协议时需要调用的私有方法最好也放在该extention中,这样会使得代码结构清晰。

如项目中的CollapsableTableScene类在实现CollapsableTableViewSectionHeaderInteractionProtocol协议的时候是这样写的:

extension CollapsableTableViewController: CollapsableTableViewSectionHeaderInteractionProtocol {  
//相关实现......
}

private fund indexPaths(...){  
//私有方法实现
}

类在实现对应协议的时候,将所有相关函数都放入了对应的extention中。

2,当一个条件不满足就需要return结束函数,最好使用guard[条件取反] else { }

如项目中:CollapsableTableViewController的ViewDidLoad函数的实现:

guard let tableView = collapsableTableView() else {  
            return
        }
//.....非空执行

如果不使用guard,那么就需要隐式解包:如下

       let tableView = collapsableTableView()
        if tableView == nil{
            return;
        }
//而之后使用tableView也需要解绑tableView!.
      if let tableView = collapsableTableView()  {
            //.....非空之行
        }else{
            return;
        };

这样的话代码结构就不再清晰,容易误导读者。

3,千万不要为一个声明为!的值,在其后添加?来调用它的实例函数。因为该值如果没有被赋值,在其后添加?调用方法则会忽略方法调用,而不会crash。导致bug难以查找。

注意:声明为!的属性,如果没有在init方法中或者在声明的时候赋初始值,编译器不会报错也不会有警告。

如项目中:MenuSectionHeader类中的interactionDelegate声明为!值,但是又在touchesEnded方法中这样调用:interactionDelegate?.userTappedView(self, atPoint: touch.locationInView(self)). 如果在interactionDelegate忘记被赋值,则userTappedView就会被忽略掉。程序bug就会比较难找。

我认为这是项目中Swift使用的一个缺陷。应当去除?.

本人iOS菜鸟一个,正在不断学习中。

以上仅是个人想法,如有缺陷欢迎指正。

谢谢。

最近的文章

隐藏NavigationBar下边线

有些app需要将NavigationBar的下边线隐藏,从而使得页面看起导航条和下面的页面融为一体。 寻找下边线View视图 - (UIImageView*)bottomLineView:(UIVie…

继续阅读
更早的文章

Swift 初始化器

Swift初始化器有两种:指定初始化器(Designated Initializer)和便利初始化器(Convenience Initializer). 指定初始化器 指定初始化器是类的最主要的初始…

继续阅读