Swift GYB

栏目: Swift · 发布时间: 6年前

内容简介:术语通过转喻的过程,内容本身被称为“样板”,并且该概念被用于包含合同中的标准化公式文本,形式字母,以及与本周关于NSHipster的代码的文章最相关。并非所有代码都是迷人的。实际上,许多使一切工作的低级基础设施都是一个模板。

术语 “样板” 可以追溯到印刷媒体的早期阶段。小型地区性报纸的填充量只有几英寸,但通常缺乏编写人员来实现这一目标,因此他们中的许多人转向大型印刷品集团,以获得稳定的内容流,可以逐字添加到他们日报的后页。这些故事通常在预设板上提供,这类似于用于制造锅炉的轧制钢板,因此得名。

通过转喻的过程,内容本身被称为“样板”,并且该概念被用于包含合同中的标准化公式文本,形式字母,以及与本周关于NSHipster的代码的文章最相关。

来小编交流群 有技术的来闲聊 没技术的来学习 691040931

并非所有代码都是迷人的。实际上,许多使一切工作的低级基础设施都是一个模板。

这是斯威夫特标准库,其中包括像符号整数类型的家庭(真 Int8Int16Int32Int64 ),其实现仅在相应类型的大小而变化。

复制粘贴代码可以作为一次性解决方案(假设您第一次设法正确),但它不可持续。每当您想要对这些派生实现进行更改时,您都可能会引入轻微的不一致性,导致实现随着时间的推移而发生分歧 - 与负责地球生命变化的随机突变不同。

语言有各种技术来处理这个问题,从C ++模板和Lisp宏到 eval C预处理器语句。

Swift没有宏系统,并且因为标准库本身是用Swift编写的,所以它无法利用C ++元编程功能。相反,Swift维护者使用一个名为 gyb.pyPython 脚本,使用一  小组 模板标签生成源代码。

GYB 是“Generate Your Boilerplate”的首字母缩写,参考 另一个Python工具,  GYP (“生成你的项目”) 

Haskell包 SYB (“Scrap Your Boilerplate”) 

GYB如何运作

GYB是一个轻量级模板系统,允许您使用Python代码进行变量替换和流控制:

%{ <var class="placeholder" style="box-sizing: border-box; background: rgb(248, 248, 242); display: inline-block; padding: 0px 0.25em; border: 1px solid rgb(40, 42, 54); border-radius: 5px; font-style: normal;">code</var> }
% <var class="placeholder" style="box-sizing: border-box; background: rgb(248, 248, 242); display: inline-block; padding: 0px 0.25em; border: 1px solid rgb(40, 42, 54); border-radius: 5px; font-style: normal;">code</var>: ... % end
${ <var class="placeholder" style="box-sizing: border-box; background: rgb(248, 248, 242); display: inline-block; padding: 0px 0.25em; border: 1px solid rgb(40, 42, 54); border-radius: 5px; font-style: normal;">code</var> }

所有其他文本都保持不变。

可以在 Codable.swift.gyb中 找到 GYB的 一个很好的例子。在文件的顶部,基 Codable 类型被分配给实例变量:

%{
codable_types = ['Bool', 'String', 'Double', 'Float',
                 'Int', 'Int8', 'Int16', 'Int32', 'Int64',
                 'UInt', 'UInt8', 'UInt16', 'UInt32', 'UInt64']
}%

复制代码

稍后,在实现中,迭代这些类型以生成协议要求的方法声明: Single<wbr style="box-sizing: border-box;">Value<wbr style="box-sizing: border-box;">Encoding<wbr style="box-sizing: border-box;">Container

% for type in codable_types:
  mutating func encode(_ value: ${type}) throws
% end

复制代码

评估GYB模板会产生以下声明:

mutating func encode(_ value: Bool) throws
mutating func encode(_ value: String) throws
mutating func encode(_ value: Double) throws
mutating func encode(_ value: Float) throws
mutating func encode(_ value: Int) throws
mutating func encode(_ value: Int8) throws
mutating func encode(_ value: Int16) throws
mutating func encode(_ value: Int32) throws
mutating func encode(_ value: Int64) throws
mutating func encode(_ value: UInt) throws
mutating func encode(_ value: UInt8) throws
mutating func encode(_ value: UInt16) throws
mutating func encode(_ value: UInt32) throws
mutating func encode(_ value: UInt64) throws

复制代码

此图案用于在整个文件中,以产生类似的方法类似地公式化的声明 ,和。总的来说,GYB将样板代码的数量减少了几千个LOC: encode(_:for<wbr style="box-sizing: border-box;">Key:)``decode(_:for<wbr style="box-sizing: border-box;">Key:)``decode<wbr style="box-sizing: border-box;">If<wbr style="box-sizing: border-box;">Present(_:for<wbr style="box-sizing: border-box;">Key:)

$ wc -l Codable.swift.gyb
2183 Codable.swift.gyb
$ wc -l Codable.swift
5790 Codable.swift

复制代码

有效的GYB模板可能无法生成有效的Swift代码。如果派生文件中发生编译错误,则可能难以确定根本原因。

安装GYB

GYB不是标准Xcode工具链的一部分,因此您无法找到它 xcrun 。相反,您可以使用Homebrew下载它:

$ brew install nshipster/formulae/gyb

复制代码

或者,您可以下载源代码并使用 chmod 命令生成 gyb 可执行文件(macOS上的默认安装应该能够运行 gyb ):

$ wget https://github.com/apple/swift/raw/master/utils/gyb
$ wget https://github.com/apple/swift/raw/master/utils/gyb.py
$ chmod +x gyb

复制代码

如果你走这条路线,一定要将它们移动到可以从Xcode项目访问的地方,但要将它们与源文件分开(例如, Vendor 项目根目录下的目录)。

在Xcode中使用GYB

在Xcode中,单击导航器中的蓝色项目文件图标,选择项目中的活动目标,然后导航到“Build Phases”面板。在顶部,您将看到一个 + 符号,您可以单击该符号以添加新的构建阶段。选择“添加新运行脚本阶段”,然后在源编辑器中输入以下内容:

find . -name '*.gyb' |                                               \
    while read file; do                                              \
        ./path/to/gyb --line-directive '' -o "${file%.gyb}" "$file"; \
    done

复制代码

确保在编译源之前订购GYB构建阶段。

现在,当您构建项目时,任何具有 .swift.gyb 文件扩展名的文件都由GYB评估,GYB会输出一个 .swift 与项目中其余代码一起编译的文件。

何时使用GYB

与任何 工具 一样,知道何时使用它与了解如何一样重要。以下是一些可以打开工具箱并进入GYB的示例。

生成公式代码

您是否为一组中的元素或序列中的项复制粘贴相同的代码?具有可变替换的for-in循环可能是解决方案。

Codable 前面的from 示例所示,您可以在GYB模板文件的顶部声明一个集合,然后遍历该集合以获取类型,属性或方法声明:

%{
    abilities = ['strength', 'dexterity', 'constitution',
                 'intelligence', 'wisdom', 'charisma']
}%
class Character {
  var name: String

% for ability in abilities:
  var ${ability}: Int
% end
}

复制代码

使用GYB进行评估会生成以下Swift代码:

class Character {
  var name: String

  var strength: Int
  var dexterity: Int
  var constitution: Int
  var intelligence: Int
  var wisdom: Int
  var charisma: Int
}

复制代码

代码中的大量重复是一种气味,可能表明有更好的方法来完成任务。协议扩展和泛型等内置语言功能可以消除大量的代码重复,因此请注意使用它们而不是使用GYB强制执行。

生成从数据派生的代码

您是在编写基于数据源的代码吗?尝试将GYB纳入您的开发中!

GYB文件可以导入Python包一样 jsonxmlcsv ,这样你就可以分析几乎任何类型的可能会遇到的文件:

%{ import csv }
% with open('path/to/file.csv') as file:
    % for row in csv.DictReader(file):

复制代码

如果您希望看到这一点,请查看 Currencies.swift.gyb ,它为ISO 4217规范定义的每种 货币 生成Swift枚举 。

通过将数据下载到可以检入源代码管理的文件而不是在GYB文件中进行HTTP请求或数据库查询,可以使编译保持快速和确定性。

代码生成使您的代码与相关标准保持同步变得微不足道。只需更新数据文件并重新运行GYB即可。

斯威夫特已经做了很多与另外的编译器合成的最近削减样板 EncodableDecodable 4.0,  EquatableHashable 4.1,和 4.2。我们希望这种势头能够在未来的语言更新中得到体现。 Case<wbr style="box-sizing: border-box;">Iterable

与此同时,对于其他一切,GYB是代码生成的有用工具。

社区中另一个很棒的工具是 Sourcery ,它允许你在Swift(通过 Stencil )而不是Python中编写模板。

“不要重复自己”可能是编程的一种美德,但有时你必须说几次才能使事情发挥作用。当你这样做时,你会感谢有一个像GYB这样的工具来为你说。


以上所述就是小编给大家介绍的《Swift GYB》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

马云内部讲话

马云内部讲话

阿里巴巴集团 / 红旗出版社 / 2010-12 / 28.00元

马云的话有什么其妙的地方? 为什么员工会把自己的CEO当作偶像? 世界都处在迷茫期,他如何确立阿里巴巴的价值观? 他怎样给已经是富翁的员工寻找新的激情? 风暴袭来,他怎么克服内心的恐惧? 他在互联网合纵连横的动机何在?一起来看看 《马云内部讲话》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具