自动关闭,作为参数的关闭,尾随关闭和Swift开罗

您可能要略过,这只是一个介绍。 我一直在与一个我要在开罗建立的新社区进行在线课程:Cairo-Swift,并且我们一直在进行在线活动,以阅读一个开源项目并了解其来龙去脉,所以每个人可以从该项目及其构建过程中学到一些东西。

该建议是由我们的一位成员提出的,因为她受到这次演讲的启发:https://www.youtube.com/watch?v = mW_xKGUKLpk

我自己没想到它会这么有用,我真的很感谢迄今为止的进展以及我们每周要经过的信息和搜索量,而这个博客确实是其中的一项特权!

我自己选择了要进行的第一个项目,因为我们是聚会,所以我选择了trySwift的聚会应用,这是一个很好的灵感,也许我们迟早可以为我们的社区构建类似的东西!

通过代码,我们发现了重复的代码,我建议我们可以通过使用泛型来将其修改为更好的版本,我最近一直在与他们一起玩,并且有点像锤子一样使用它,所以让我们看看它在哪里走!


基本代码是:

  func showAbout(){让aboutViewController = AboutTableViewController()performSegue(withIdentifier:moreDetailSegue,发件人:aboutViewController)} webViewController = WebDisplayViewController()webViewController.url = URL(字符串:conference.codeOfConductURL)!  webViewController.displayTitle =“行为准则”。localized()performSegue(withIdentifier:moreDetailSegue,发送者:webViewController)} func showOrganizers(){让organizerViewController = OrganizersTableViewController()performSegue(withIdentifier:moreDetailSegue,发送者:organizerViewController)} func showLibraries() {let path = Bundle.main.path(forResource:“ Pods-trySwift-acknowledgements”,ofType:“ plist”)let ConfirmationesViewController = AcknowListViewController(acknowledgementsPlistPath:path)ConfirmationesViewController.edgesForExtendedLayout = [] confirmmentesViewController.headerText =“我们❤️打开源代码软件”。localized()performSegue(withIdentifier:moreDetailSegue,发送者:confirmationesViewController)} 

你能发现吗? 这是使用特定控制器和String ID执行segue的重复代码,因此让我们将其转换为通用函数吗?

  func navigationTo (_ withType:T.Type,id:String =“ moreDetailSegue”){ 
performSegue(withIdentifier:id,发件人:T())
} //称呼它
navigationTo(UIViewController.self)

最初,我尝试使用T.initialize()碰壁,这是通过Xcode自动完成来完成的,而.init()甚至simple()根本不显示,花了大约15分钟的时间来尝试找出问题所在用我的代码,我去看了关于该功能的苹果文档,但我完全不了解。

只是一个奇怪的函数,不会像我想的那样初始化!

上面的函数将摆脱上面的几个函数,并保留最后两个,那么我们如何改进呢?

我将几个修改过的viewcontrollers移到了懒惰的var中,所以我们可以获取它们并将它们轻松传递给函数:

 懒惰的var webViewController:WebDisplayViewController = { 
让webViewController = WebDisplayViewController()
webViewController.url = URL(string:Conference.codeOfConductURL)!
webViewController.displayTitle =“行为准则” .localized()
返回webViewController
}()


懒惰的var确认:AcknowListViewController = {
let path = Bundle.main.path(forResource:“ Pods-trySwift-acknowledgements”,ofType:“ plist”)
让vc = AcknowListViewController(acknowledgementsPlistPath:path)
vc.edgesForExtendedLayout = []
vc.headerText =“我们❤️开源软件” .localized()
返回vc
}()

现在,我们将它们放在一个懒惰的var中,干净而甜美! 让我们修改我们的通用函数?

  func navigationTo (_控制器:()-> T,id:字符串=“ moreDetailSegue”){ 
performSegue(withIdentifier:id,发件人:controller())
} //调用它:
navigationTo({OrganizersTableViewController()})

现在,它以闭包作为参数,可以与惰性var一起正常工作,并且可以轻松创建和传递UIViewControllers。

我对闭包上的()存在不满意,想删除它,所以我了解到以这种方式调用尾随闭包,因为它实际上是尾随参数,因此我将函数的签名修改为:

  func navigationTo (id:String =“ moreDetailSegue”,_控制器:()-> T){ 
performSegue(withIdentifier:id,发件人:controller())
} //现在调用它:
navigationTo {OrganizersTableViewController()}

现在,我对我们所达成的目标感到非常高兴,几乎30条线现在变成了3条线,即提高了10倍!

我提交了请求请求,并得到了Bas Broek的评论:

我也喜欢他的建议,尽管我不相信必须写{},但是看起来更好,也许这是“致”的东西? 嗯,我提出了挑战并推了代码!

但是,今天我看了一篇有关Swift属性的文章,瞧!

当我发现@autoclosure属性时,这是一个启发时刻,这就是我需要摆脱那些丑陋的{}的原因! 检查他写了什么:

该属性可以神奇地将具有不带参数但返回类型的闭包参数的函数转换为具有原始闭包返回类型的参数类型的函数,因此您可以更轻松地调用它。 🤓

– TiborBödecs,关于公共和私有Swift属性的一切

我的大脑就像💡! 我立即解雇了我的Xcode,并尝试了一下! 而且效果很棒!

  func navigation (至控制器:@autoclosure()-> T,id:String =“ moreDetailSegue”){performSegue(withIdentifier:id,sender:controller())} //称为 
导航(至:OrganizersTableViewController())

现在感觉就像超级! 哇,我肯定会爱上迅捷的! 就像完美,对吗?


因此,如果您是位于埃及/开罗的iOS开发人员,请通过slack / meetup或@swiftcairo在Twitter上加入我们的社区,并帮助我们发展成为一个更好的社区!

感谢您读完这篇文章,感谢您的鼓掌,分享,当然也加入了我们新的swiftcairo社区!