一次stdio和stdout故事-这次:快速

我的第一个博客是关于使标准输入和输出任务适用于Objective-C的事情,这并非自然而然,因为您需要使用一些良好的旧C函数(scanf和printf)。 出于某些原因,我没有想到立即尝试一下,直到听到我的同学Joe说道:“嘿,Cenker,您有一个关于在hackerrank.com上使用Objective-C的博客。 您如何迅速做到这一点? 你尝试过吗?”。 我的回答是我不知道该如何做,因此我决定进行研究,进行一些研究,并将其写为博客文章,因此我们开始:

我们将要处理的问题是hackerrank网站上的问题之一。 该网站在两个单独的行中为您提供了两个三胞胎,并要求您在标准输出上打印两个数字。 第一个数字显示前三个数字中有多少个大,然后第二三个数字中对应的数字大,第二个数字反之亦然。 如果数字相等; 不用找了。 这是他们网站上的问题:

很快,我们很幸运,因为print()与NSLog()在写入标准输出时有所不同(NSLog()写入标准错误)。 因此,如果我们计算数字并调用print(),它将正常工作。 这很简单。 为了满足问题的要求,我们将在格式化的字符串中打印两个数字,并且在两者之间使用一个空格。

不过,最棘手的部分是弄清楚如何捕获输入。 为此,swift具有一个名为readLine(stripNewline :)的函数。 它读取一行用户输入。 如果您有第二行,则在按Enter键后将读取第二行。 它返回一个可选字符串。 它的参数是布尔值,其默认值为true。 该参数询问您是否要排除换行符,换行符是在您按Enter键时添加到字符串中的字符。 是的,大多数时候您都希望排除它,因此默认值为true :-)。

该readLine()函数和Playground的问题在于,由于无法模拟用户输入,因此无法使用XCode Playground文件对其进行测试。 测试方法是通过终端。 Apple有一个用于快速(repl)的命令行工具,您可以在其中打印快速字符串或进行一些类似于ruby或python的快速计算。 看来,尽管如此,您无法使用readLine测试我们的代码(因为我们需要从命令行输入),因此我们需要寻找另一种方法。 下面是我试图使readLine()与swift repl一起工作(一路出错):

通过用户输入快速检查代码的方式与其他语言类似。 您可以创建一个带有swift扩展名的文件,例如myFile.swift。 然后,通过在终端的命令行中输入“ swift myFile.swift”来运行代码(当然要减去引号)。 这是此练习的代码和输出:

这样,您可以通过终端模拟正在处理的问题的输入,并使用readLine()函数测试所读取的内容。 之所以这样做,是因为该网站未向您显示readLine()函数收到了什么以及代码输出了什么。 由于无法读取用户输入,因此无法使用游乐场文件进行全面测试。

我认为上面的代码非常明显。 我试图使它尽可能清晰,但没有试图将其最短的版本作为我的主要目标,以展示如何使用swift测试用户输入和输出。 我还强行解开readLine()函数返回的可选字符串。 在生产代码中通常不建议这样做,您需要使用if let / var语句将其拆开。 这样做是为了进行此练习🙂

我希望这可以帮助别人!