Swift GYB

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

内容简介:术语通过转喻的过程,内容本身被称为“样板”,并且该概念被用于包含合同中的标准化公式文本,形式字母,以及与本周关于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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

商战

商战

杰克•特劳特、阿尔•里斯 / 李正栓、李腾 / 机械工业出版社 / 2011-3 / 42.00元

本书重点阐述了商战中的四种常用战略形式,如防御战、进攻战、侧翼战和游击战,针对每一种形式又提出了三条应遵循的原则,以及如何在具体的商战中应用这些原则。本书分析了商战中的实际案例:可口可乐与百事可乐的战役,汉堡王与温迪斯对麦当劳的挑战以及DEC对阵IBM等。这些人们熟知品牌的案例在作者精心的组织下,使读者不仅加深了对本书中心思想的理解,而且学习了如何在实战中具体应用各种营销战略和策略的技巧。 ......一起来看看 《商战》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具