Swift的10个很棒的Swift功能-顽固的Swift反对者(第1部分)

在成为顽固的Swift支持者(和狂热的Objective-C防御者)之后,几个月前,我首先进入了我的第一个Swift专属项目。 该项目是一个相当新的项目,仅包含几千行代码,因此这是一次完美的机会,可以最终为Swift提供应有的诚实机会。

但是,为什么要解决没有破裂的问题呢?

这是一个合理的问题,无需妖魔化Objective-C的活力。 它为开发人员服务了三十多年。 那么,为什么最近又反派呢? 显然,像Objective-C这样的动态语言在这个世界上仍然应该占有一席之地。 另一方面,通过前述的动态性可以避免一整类错误,同时使以前认为不可能的编译器优化成为可能。 同样,活力/严格性辩论似乎是季节性的,有时会不时地交替进行。 我来了,我现在是坚定的专业型安全。 受函数编程的启发,Swift还强烈鼓励不变性,在我看来,不变性导致代码更易于编写和理解。

最后,由您决定Swift是否可以在您的应用程序开发工具箱中替换Objective-C。 但是有一点很清楚:苹果公司出于自身的原因已经停止改进Objective-C。 取而代之的是,仅应用改进来提供与Swift更好的互操作性(例如,最近,可空性和轻量级泛型)。 苹果公司未来的所有开发工作都将集中在Swift上。 跟随他们的领导并不是一个坏主意,如果您尚未开始,现在可能并不是一个糟糕的开始时间,因为苹果公司承诺在Swift 3后的时间框架内减少代码破坏。

如果您决定坚持使用Objective-C,则有10种Swift特权无法利用:

  1. 协议扩展的默认实现
  2. 通过后卫轻松提前归还
  3. 带有尾随闭包的更流畅的API
  4. 具有默认值的功能参数
  5. 使用基于订单的参数名称进行单行闭包声明
  6. 枚举轻松命名
  7. 扩展中的协议实现
  8. 在单个.swift文件中定义多个类/结构/协议/扩展名
  9. 自动生成结构中的初始化参数
  10. 内置对延迟实例变量的支持

我今天只有时间来参加前三场比赛,所以让我们开始吧。

1.协议扩展的默认实现

协议(其他语言的“接口”)“非常棒”。 它们是软件体系结构的组成部分之一,并且在每个软件项目中都有一席之地。 与扩展结合使用时,Swift的协议甚至更强大。 它们实际上是Rubyists所称的mixins:行为的一部分,可以将其添加到类中,而无需子类化。 以下示例取自我的用于Coordinator设计模式的开源工具包,称为CoordinatorKit。

考虑协调器ComposableCoordinator协议:

它们只是简单地定义:任何协调器至少应具有start()方法,并且适合协调器层次结构的任何协调器应至少公开其子级数组。

此模型中的常见操作是按其类型查找子协调器,然后将其返回。 以下方法完成了该功能的重复执行:

为了避免在各处重新实现(或将其定义为公共功能),一种解决方法是创建一个抽象超类,该超类实现ComposableCoordinator并在此实现。 虽然可行,但有点代码味道,因为Swift没有正式的“抽象”类概念。 这种强制子类化也限制了用户,因为像大多数面向对象的编程语言一样,Swift只允许单继承。 Swift-way将在协议扩展中声明此重复功能:

任何符合ComposableCoordinator的类都将免费获得findChildCoordinator ()方法,而无需子类化。 因为这是面向协议的,所以您可以以不依赖约定的方式混合使用任意数量的功能,并且可以由语言和工具支持。 当然,只要SourceKit不会崩溃,Xcode就会在任何兼容的类上自动完成此方法签名(眨眼眨眼)。

2.轻松让守卫提前归还

在Swift中,对可选对象的处理非常重要,因为这是该语言保证安全的方式之一。 相比之下,Objective-C并未提供对nil值处理的任何保护措施,从而可能导致各种类型的与nil相关的崩溃。 尽管如此明确地说明了可选值可以提高安全性,但它会以无数个可选的if拆包if语句的形式增加程序员的开销。 值得庆幸的是,苹果公司通过引入复合if语句解决了if let嵌套问题,但是这个守卫let事情是什么呢?

通常,在执行方法之前,需要将多个可选值解开,以作为一种验证手段。 为防止多次重复if let(嵌套或非嵌套),可以在作用域的开头使用警卫队let来包装可选内容并强制尽早返回(并另外引发错误或进行其他某种处理)。 此后,您可以简单地假装不存在可选选项。

考虑一些假想的登录代码的示例:

可选的展开方式方便地集中在一个地方,而无需嵌套或逻辑分支。

3.尾随闭包的流利API

自从引入Objective-C块(Swift中的“闭包”)以来,Apple一直在合理的地方将其添加到其API中。 到目前为止,完成关闭是最常见的。 例如:

我知道肤浅,但是却使封锁变成了一流的公民。 它们与其他语言更加自然地融合在一起,并通过消除了右括号来减少视觉混乱。

更新

我要感谢以下人员对我的文章做出的建设性回应:

关于可重排序的参数 :/ r / swift上的Kyro38正确地指出,此功能实际上已在Swift 3中删除。 您可以在此处找到Swift Evolution提案。 如果您一直在使用此功能(像我一样),则为即将进行的更改准备代码将不会有任何伤害。

关于使用结构命名空间 :@boolkybear在Twitter上建议使用枚举会更好,因为无法实例化它们,这与结构相反。 诚然!

最初发布在 jarroo.com上