Tag: xcode

WWDC18:在Xcode 10中优化Swift构建时间的现代技巧

使用Xcode 10,在构建Swift项目时,性能和开发人员的工作效率有了很大的提高。 构建时间很无聊,如果构建时间更长,可能会分散开发人员的注意力,Apple付出了一些努力来优化构建时间,尤其是对于Swift语言。 基本上,构建时间取决于所使用的代码行,代码行数,依赖性和机器配置。 Xcode 10和Swift编译器今年都宣布了各种新功能,从而使Swift构建比以往更快。 这个GitHub存储库中已经涵盖了各种技巧,但是我们将介绍Xcode 10和Swift 4.2中的新增内容,这些内容将有助于我们更快地构建Swift。 1.了解Xcode的构建过程 构建过程是使用一些本机命令行工具(例如swiftc,clang,ld,actool,ibtool等)在后台执行的任务的集合。它涉及编译和链接源代码,复制资源(如资产,StoryBoards,代码)使用构建脚本等进行签名和自定义。 但是,Xcode的构建过程可以有效并以正确的顺序自动执行这些任务,因此我们可以加快构建过程。 如果可能,可以并行完成Swift源文件的编译,以便链接器可以一次执行所有这些任务,以准备应用程序的可执行文件。 Xcode构建系统负责分析依赖关系并确定可以并行运行的任务。 理解增量构建的概念也很重要,这样,如果不进行更改,就不需要构建所有东西。 通过观看此WWDC会话,您将了解有关Xcode构建过程如何在后台工作的更多信息。 为了加快构建过程,我们应该通过识别和优化应用程序中的依赖关系来帮助构建系统更快地完成其工作。 这就是为什么了解Xcode构建过程如何在后台运行很重要的原因。 2.使用新的构建系统 Apple在Xcode 9中启动了新的构建系统,但默认情况下未激活它。 但是,对于Xcode 10,默认情况下会激活新的构建设置,并从Xcode文件->项目/工作区设置中启用 查看有关Xcode新构建系统的先前博客文章,以获取有关构建系统的详细信息。 如果要使用xcodebuild从命令行构建iOS项目,那么我们必须传递附加参数-UseNewBuildSystem = YES还将强制使用新的构建系统。 新的构建系统称为xcbuild。 苹果xcbuild的二进制文件位于路径中 /Applications/Xcode.app/Contents/SharedFrameworks/XCBuild.framework/Versions/A/Support/xcbuild 3.并行化Swift构建 Xcode项目由多个目标组成,一个目标可能依赖于另一个目标来构建。 Xcode目标指定了要构建的产品,例如,对于主应用程序和单元或UI测试,我们可能有不同的目标。 当一个目标依赖于要构建的另一个目标时,它会创建依赖关系,例如对iOS应用程序的单元测试,我们首先需要构建主应用程序,然后才能构建单元测试目标以执行单元测试。 在Xcode构建阶段中,我们可以使用Target Dependencies显式指定目标依赖关系,并隐式使用Link Binary with Libraries 串行构建目标将需要时间,并且可能不利于利用系统资源。 如果可能的话,建立目标真是太棒了。 借助Xcode 10,我们可以并行化构建并分析引擎盖下的依赖关系,从而显着增加了构建时间。 我们可以通过编辑Xcode方案并在方案的构建动作中检查并行构建来启用并行构建。 确保同时检查了Parallelize Build和Find Implicit Dependencies,以确保我们从Xcode中获得最佳性能。 并行化构建将确保在可能的情况下并行运行构建,并且Find Implicit依赖项将检查项目内部的所有依赖项,通常在“将二进制文件与库链接”构建阶段。 Xcode 10还引入了“并行目标构建过程”的功能,这意味着从属目标可以尽快开始编译而无需首先等待完成,但是它必须等待第一个目标的“运行脚本”阶段。 4.改善运行脚本阶段 在Xcode的构建阶段,我们可以添加自定义运行脚本来根据我们自己的项目需求进行构建过程。 很好的例子是Carthage,如果您使用Carthage进行依赖项管理,那么您必须经历过运行脚本阶段。 […]

协调员基本教程。 第一部分

2015年,在著名的iOS会议NSSpain’15上,Soroush Khanlou作了介绍性演讲“ Presenting Coordinators”。 在这次演讲中,他描述了协调员的整个想法,并展示了一些用Objective-C编写的示例。 总体思想来自《企业应用程序体系结构模式》一书,该书解释了应用程序控制器模式,并被Soroush采纳用于移动开发。 您可以在此处查看演讲视频。 我一年前喜欢这个视频,整个想法给我留下了深刻的印象。 在二月的一个寒冷的夜晚,我用这种架构方法的第一次迭代编写了一个示例项目。 当然,我使用Swift作为主要语言。 之后,我一步一步改进了这种方法,并涵盖了越来越多的用例。 两个月后,我开始将协调器集成到生产应用程序中。 最初,协调员只驱动了少数功能,但最后,应用程序的框架却完全由它们驱动。 后来,我添加了深层链接支持,推送通知,强制触摸功能以及灵活的流程,所有这些都由协调员处理。 我现在想与您分享的是这种经历。 如果您想跳过我的解释并查看代码,请访问以下链接。 让我们从一堆问题开始。 什么是移动应用程序中的流程? 流是逻辑上链接的屏幕队列。 我们所有的屏幕都可以按流程划分:身份验证流程,电话验证流程,预订流程,个人资料编辑流程等。 我们通常如何管理流中的屏幕? 假设我们有一个身份验证流程,并且在流程中我们需要验证用户的电话。 让我们以这样的方案为例: 我们通常如何处理此流程中的导航? 在最常见的情况下,控制器告诉路由器推送新的控制器。 它在代码中的外观如下: 下一个常见情况是在控制器之间发送数据。 想象一下,我们有一堆控制器,我们需要在它们之间共享数据。 我们如何做到这一点? 使流独立的另一个常见原因是它们可以在不同地方重用的能力。 例如,假设您有一个电话验证流程,然后成功将其用作身份验证流程的一部分。 现在,如果您需要在配置文件中使用相同的流程,则可以。 引言摘要 直接处理流程的方法通常非常糟糕: 控制器很难重用 每个控制器都知道其他控制器 很难改变流量 很难测试 协调员 模组 首先,让我们介绍一下模块。 模块是MVC,MVP,MVVM和Viper架构方法的一种架构元素。 在最简单的情况下,对于MVC,模块是控制器,对于Viper,模块是Interactor-Presenter-View。 我们需要做的是编排模块。 什么是协调员? 协调器是一个对象,该对象处理导航流并在打开下一个链后共享下一个协调器的流处理。 这意味着协调员应仅在屏幕之间保持导航逻辑。 协调器可以保留对存储的引用,该存储包含工厂用于创建模块的数据,但是它们永远不能处理模块的业务逻辑,也不能驱动单元的行为。 只有在点击一个单元格后按下下一个屏幕时,才发生单元格交互。 我们为什么要使用它? 主要目标是承担模块之间的未链接责任,并彼此完全独立地构建模块。 迭代之后,我们可以轻松地以不同的流程重用它们。 回到前面的示例,让我们看一下如何改进身份验证流程。 首先,我们需要分离两个不同的流程:身份验证和电话验证。 拆分后,我们可以在所需的任何地方重复使用它们。 […]

增强现实(AR)iOS应用开发

对于我们在Makers Academy的最终项目,我们的团队提出了一个想法,即创建一个用于检测空气污染水平的增强现实应用程序。 基本思想是学习一种新语言和新技术,这促使我们在第一天进行探索,看看是否更适合开发增强现实应用程序的Android Studio或Xcode。 由于Cindy和我都是Android Phone的忠实用户,因此我们在Android Studio上开发了一个演示Android App。 作为iOS用户的Noelle和Somayeh使用Xcode开发了演示iOS应用程序。 事实证明,Xcode拥有ARKit,可将数字对象和信息与您周围的环境融合在一起,使应用程序远远超出屏幕范围,并释放它们以全新的方式与现实世界进行交互。 第2天,我非常兴奋能在Xcode中对ARKit进行更多的探索,并开始在Xcode中构建我的第一个AR App,它看起来像这样。 我对第一个AR演示应用程序感到非常满意,然后用3D Globe替换了它,为此我基本上在项目中更新了View Controller文件以显示Globe。 当我们进入第3天时,我们对MVP有了一个更好的了解,并且对Xcode中的ARKit有深入的了解。 当我们遵循Makers的测试驱动开发(TDD)时,第3天更多地是要弄清楚Xcode中的单元测试和UI测试。 经过一些研究发现,Xcode具有内置的测试框架XCTest。 我在Xcode上找到了一个有关FizzBu​​zz测试的非常有用的博客,然后继续为iOS构建FizzBu​​zz游戏,以便在Swift中练习TDD。 Swift 3中的TDD入门 已针对SWIFT 3和XCODE 8更新 通过上面的博客可以帮助我理解XCTest框架的基础。 我们的MVP包括拥有AR iOS应用程序,该应用程序可以检测给定GPS坐标下的空气污染水平。 基本上,我们计划通过添加不同的表情符号以显示不同程度的污染,将有趣的元素引入我们的应用程序。 我将在我即将发布的博客中向您发布有关我们项目进度的信息。

iOS开发系列1.1简介-导航窗格概述

导航窗格使我们可以在项目的各个部分之间移动。 在导航窗格中,我们有8种类型的导航器。 我们可以通过将鼠标悬停在每个图标上来找到每种类型的导航器。 这将是一个小技巧,例如“ Show project navigator”等。 按顺序有不同的导航器: 项目浏览器 源代码管理导航器 符号导航器 查找导航器 问题导航器 测试导航器 调试导航器 断点导航器 报表浏览器 在开始阶段,我们最常用的导航器是项目导航器和问题导航器。 项目导航器将我们的程序文件组织到各个部分中。 我们将把大部分时间都花在项目导航器上。 问题导航器将显示无法构建我们的应用程序时遇到的所有问题。 问题导航器会将我们带到问题所在的正确位置,以便我们进行修复。 项目浏览器 项目导航器是最常用的部分。 在项目导航器中,我们有多个下拉文件夹,从项目文件夹开始,然后是3个子文件夹。 如果我们通过单击三角形进一步扩展文件夹,它将显示每个文件夹下的所有文件,如下所示。 要构建一个应用程序,我们需要利用多个文件。 项目配置 要浏览项目配置,我们必须在项目导航器中选择项目标题,如下所示: 选择项目标题后,中间的部分将显示详细信息,如下所示: 这是项目配置页面。 本部分允许我们设置构建属性或更改那些设置。 项目配置页面非常复杂。 我们将仅覆盖“常规”标签下的前3个部分。 第1部分:身份-本部分显示基本信息,例如项目名称及其版本。 第2部分:签名-当我们需要部署应用程序时,本部分很重要。 否则,我们可以忽略错误消息。 第3部分:部署信息-本部分说明如何部署我们的应用。 请参考以下详细信息: 部署目标是指当前版本的iOS 设备使我们能够为iPhone或iPad或两者构建应用程序。 如果设备设置为“通用”,则可以在iPhone或iPad上运行应用程序。 我们通常不调整主界面。 我们将其保留为原样。 设备方向允许我们为应用设置方向。 我们可以删除横向复选框,以便我们的应用仅在纵向模式下运行。 我们将其余设置保持不变。 我们将更改的常见设置是“设备”和“设备方向”。 主项目文件夹 大部分程序文件位于主项目文件夹中,如下所示 我们将触摸AppDelegate.swift,ViewController.swift,Main.storyboard,Assets.xcassets和info.plist AppDelegate 选择文件AppDelegate.swift,如下所示。 中间部分将显示此文件的详细信息。 AppDelegate.swift是应用程序的主文件。 […]

在iOS应用程序中显示弹出窗口

弹出窗口很重要。 有时,它们很烦人(是的,我说的是网页上的随机弹出窗口)。 当它们很重要时,它们可以显示有关应用程序执行,状态管理,要求用户提供输入或某些访问权限等信息。 那么,如何在iOS应用中显示有意义的弹出窗口? 让我们找出答案! 启动Xcode 首先,让我们在Xcode上打开一个项目。 我们还要如何开始? .__。 创建一个单视图iOS应用程序 。 接下来,在启用了助手编辑器的情况下打开Main.storyboard 。 现在,让我们凝视空白的UIView一会儿,然后迷失在应该做什么上。 好吧,没那么多。 我们需要显示一个弹出窗口。 但是弹出窗口需要由某种东西触发,或者用一些事件/动作来触发。 那么我们如何触发事件/动作 ? 考虑可以触发或向ViewController发送某些动作的控件。 最简单的方法:添加按钮! 好的,让我们向视图添加一个按钮。 但是,仅添加按钮就能完成我们的工作吗? 不。 这不是魔术! 首先,为按钮创建一个插座,因为按钮无法创建自身。 ( 按住Ctrl键并单击鼠标左键,然后将其拖放到ViewController.swift文件中)。让我们将其命名为popButton 。 现在,您的ViewController.swift文件应如下所示。 那个小按钮? 继续前进,按钮看起来很小,但吸引力不大。 让我们添加一些样式。 就我们而言,仅更改Font和Font大小就可以了。 还让我们给它一个有意义的标题,而不只是“ Button ”。 根据图像设置字体和标题。 现在,我们正在进行样式设计,现在,我们的按钮如下所示– 我知道你会问这个问题。 稍安毋躁。 我们到了那里。 是时候添加一些动作了! 好的,现在让我们为按钮插座创建一个动作。 将其命名为showPopUp。 应该是这样的 现在已经定义了动作,让我们开始显示弹出窗口。 UIAlertController:那是什么? UIAlertController负责在我们今天看到和使用的iOS应用程序中创建弹出窗口。 因此,按照Apple Documentation的术语,我们需要创建一个UIAlertController实例并呈现 (显示)它。 首先创建UIAlertController 。 actionSheet弹出窗口从底部显示,可以容纳多个动作。 […]

iOS-如何在界面生成器中使用安全区域布局

本篇文章没有要讨论安全区域是什么,只有单纯纪录如何使用界面生成器来更改原始导航栏或工具栏 会有这个需求是因为画面客制化的关系,没办法直接使用原生的导航栏/工具栏,得自己刻出类似的画面。 如果直接把灰色视图的顶部,前导,尾随约束指向安全区域,会变成上图右边的状况,status bar的部分会空着,没办法像左图那样的效果 把view的顶部约束指向指向superview,结果赋予view跑到status bar底下 回到上一个状态(顶部约束指向安全区域),在视图中间加入一个标签,执行结果如下图,但我想要达成的效果应该是标签在相同的位置,视图的高度不变,然后状态栏跟随标签所在的视图是一样的颜色 以下的view指的是灰色长条状,用作考虑的标签的superview 将标签的顶部约束重新指向视图控制器>视图>安全区域 2.将视图的顶部约束改为指向超级视图,常量设为0,高度设为≥44 3.重新执行后,画面就会如预期想要的那样 4.要特别注意的,标签一定要加上底部约束指向视图,不然就会出现下图的状况 等等,还没结束 以上的作法都是在storyboard完成的,但在xib上会遇到什么事? 一样的autolayout配置,使用在xib上,在iOS12上看是正常的,但iOS10就跑版了,有一部分跑到status bar底下去(如下图) label增加一个约束(要查看的顶部空间),常量设置≥32,优先级设置为1000,原本指向视图控制器>视图>安全区域的约束(将顶部对齐至安全区域)优先级设为750,再执行一次就可以看到正常的画面 我把范例档案放在这边,有兴趣的话可以载来看看! iOS –安全区域布局在iOS 9和iOS 10上不起作用 感谢您为Stack Overflow提供答案! 您过去的一些答案尚未得到很好的接受,您正在… stackoverflow.com

如何将实时调试值从XCode写入CSV文件

有时,您需要在Xcode中跟踪或保留正在运行的应用程序中的实时数据。 在IOS中,能够收集一些传感器信息(如加速度计)会很棒。 幸运的是,Xcode让您轻松自在。 只需在需要数据的地方放置一个断点即可。 然后从上下文菜单中编辑断点。 您可以在此处为断点分配操作。 我创建了一个简单的python脚本,该脚本仅将两个数字作为参数并将其保存在CSV文件中。 唯一的窍门是,您必须用virgule分隔每个参数项,并用double @符号将变量名括起来。 例如,像这样的shell命令: ./plotXY.py -f ./data.csv -p 1 2 您必须像这样编写参数列表: -f,./data.csv,-p,1、2 启用“等待完成”是一个好习惯。 plotXY.p很简单。 该文件以文件名和x,y为点,并将它们写入CSV文件。 Vola,现在您的号码已保存在CSV文件中。 下一步将是现场绘制它们。

如何在Xcode第2部分中创建iOS应用的多个版本

在本教程的第一部分中,我解释了如何为同一应用创建稍有不同的版本。 确保您先阅读此内容。 我遗漏的是如何处理资产。 在本文中,我将解释如何根据构建的配置来创建不同的启动图标和其他资源(例如,在应用程序图标和音频中)。 启动图标 让我们从应用程序的启动图标开始。 还记得我们在第一部分中创建了一个名为LANGUAGE_CODE的自定义构建设置吗? 现在,我们将使用此标志来确保我们使用正确的资产来构建我们的应用程序。 对于这两种应用程序变体(泰文和中文),创建一个新的资产目录:按Command + N>资产目录。 将文件命名为img-th.xcassets(泰语),将文件命名为img-zh.xcassets(中文)。 确保两个文件都勾选了将资产添加到目标的复选框。 现在,通过选择+>新建iOS启动图标来创建新的启动图标。 将图标命名为Thai AppIcon.th,将图标命名为中文AppIcon.zh。 完成此操作后,我们需要告诉编译器使用正确的应用程序图标。 转到第1部分中所述的构建设置。这次,搜索“资产目录”,然后选择构建设置“资产目录应用程序图标集名称”。 输入值AppIcon。$ {LANGUAGE_CODE} 现在,我们可以一个接一个地构建应用程序,它将为每个应用程序显示正确的图标。 问题是,即使我们只需要一个,Xcode现在也将两个启动图标打包在应用程序包中。 在此示例中,这可能还不错,但是假设您有30个这样的应用程序。 每个应用程序中有29个不必要的图标吗? 听起来是个坏主意! 简单方法:从构建中排除不必要的资产 解决方案是名为EXCLUDED_SOURCE_FILE_NAMES的构建设置。 如果只有两个应用程序,则现在可以继续进行操作,并从构建中排除不需要的文件,如下所示: 转到构建设置,然后选择+>添加用户定义的设置。 将新设置命名为EXCLUDED_SOURCE_FILE_NAMES。 设置的值对于泰语应为img-zh.xcassets,对于中文应为th.xcassets(“调试和发行版”的值应相同) 但是,再次想象一下,您有30个应用程序。 那么您将为30个应用中的每一个排除29个资产目录。 不好笑! 进阶方式:包含必要的资产 但是有更好的方法(有点棘手)。 如果只有2-4个应用程序,则可以跳过此步骤,并轻松进行操作。 首先,删除在最后一步中放入EXCLUDED_SOURCE_FILE_NAMES设置中的值。 现在,为您的所有应用程序变体(泰式调试,泰式发行,中文调试,中文发行)赋予相同的值:img-*。xcassets。 之所以有效,是因为EXCLUDED_SOURCE_FILE_NAMES将*理解为通配符。 这意味着您从构建中排除了所有资产。 然后,创建另一个名为INCLUDED_SOURCE_FILE_NAMES的用户定义的构建设置。 为其指定值img-$ {LANGUAGE_CODE} .xcassets。 现在,它将首先排除所有资产,然后仅在构建中包括必要的资产。 这是因为变量INCLUDED_SOURCE_FILE_NAMES在EXCLUDED_SOURCE_FILE_NAMES之后被应用。 (站点注释:您可能会问,为什么会那么麻烦?为什么不先将xcassets从构建目标中保留下来,而不是将其添加并以后再排除它?这是因为当您不包括启动图标时,编译器会抱怨在目标中。) 应用内图标 如果您希望在应用程序变体中有任何不同的图标,这非常容易。 只需在您的资产中创建它们以及启动图标即可。 在构建过程中,将选择正确的资产。 其他资源 在我们的应用程序中,根据应用程序变体,我们需要另外加载两个其他资源:一个数据库文件(我们使用Realm)和一堆音频文件。 您无法将这些文件添加到目标中,而无法通过脚本添加它们: […]

UILayoutGuide

快速说明-我将来所有的帖子都将发布在我的专用网站上,并且此出版物不再更新。 谢谢阅读! 令人惊讶的是,我们不久之前就生活在一个“自动布局”世界中。 自动调整遮罩大小和CGRectMake()统治了相当长一段时间的用户界面开发领域。 但是随着苹果设备开始堆积各种点大小,很明显,开发人员要么陷入痛苦,要么因过多的框架计算而陷入困境,要么接受描述关系的力量。 后者显然胜出。 因此,自此以来,Auto Layout就一直被使用,DSL和批评。 但是,随着它的兴起,另一种布局范例也应运而生。 “间隔”视图。 或虚拟视图。 容器视图。 无论您怎么说,我们都使用过它们。 但是苹果公​​司说,有一种更好的方法。 本周,让我们聊天UILayoutGuide 。 但是,虚拟景色岩石(…并且我同意) 虚拟视图非常好地解决了一些布局问题。 这就是为什么我们都使用它们。 表达视图间的关系,创建用户界面的模块块或定义约束以表达视图之间的空白空间的坐标或大小,所有这些都称为虚拟视图。 实际上,即使只是希望将一组控件放在特定坐标空间的中心,也常常使用虚拟视图来包含它们。 这样,许多重要的工作都被委托给了一个从来没有真正去做任何事情的结构。 如果您反对这种想法,请问自己一个视图在iOS应用程序中的实际作用。 或者更好的是,让文档讲故事: 视图对象在其边界矩形内呈现内容,并处理与该内容的任何交互。 视图是UIResponder的子类,可以响应触摸和其他类型的事件。 因此,几乎无可辩驳的是,视图的重要组成部分是视图,即渲染事物和处理事件。 虚拟视图,尽管它们是视图,但最好不要参与其中的任何活动,最坏情况下不要参与其中的一些活动。 使用虚拟视图,我们已经 产生仅有助于定义布局的视图的成本。 添加了视图层次结构的第一类成员,加入了可能与之相关的任何任务相关的所有开销。 并且作为响应者链的一部分,它可以拦截一些原本不想处理的消息。 😬。 在那里,但不是真的 但是,布局指南既不是这些东西,也不会遭受任何这些问题的困扰。 这是一个非渲染视图,非常类似于其更强大的表亲UIStackView 。 与真实视图不同,布局指南实际上并未定义视图。 取而代之的是,它仅代表其拥有的视图的坐标系中的矩形区域。 而已。 这就是它与自动版式进行交互的原因。 该API紧密地(有意地)镜像视图的镜像: 让scrollView = UIScrollView()//代替这个… 让containerView = UIView() scrollView.addSubview(containerView)containerView.widthAnchor.constraint(equalTo:scrollView.widthAnchor).isActive = true containerView.heightAnchor.constraint(equalTo:scrollView.heightAnchor).isActive = true containerView.leftAnchor.constraint(equalTo:scrollView.leftAnchor).isActive […]

如何在Xcode中构建命令行应用

我最近在Xcode中为命令行创建了一个代码练习,但是遇到了很多配置问题。 最后,我能够构建两个目录,一个目录用于可执行文件,另一个目录用于测试并容纳所有代码。 在本快速教程中,我将引导您通过Terminal设置命令行项目。 这将使用Swift Package Manager,因此我将使用它生成的默认代码。 跳到底部,可以查看有关如何允许用户输入.txt文件名并允许Terminal打印其内容的非常快速的教程。 本文使用: Xcode版本9.2 Apple Swift版本4.0.3 首先,打开两个终端窗口并输入以下内容: mkdir CommandLineAppDirectory cd CommandLineAppDirectory / mkdir CommandLineApp mkdir CommandLineAppExe 到目前为止,非常简单,设置一个目录文件夹,导航到其中,并创建两个文件夹,其中一个附加了Exe,这样我们就知道哪个是可执行文件。 接下来,让我们设置我们的CommandLineApp。 我们将最后保存可执行文件。 cd CommandLineApp / swift package init –type库 快速测试 迅捷包generate-xcodeproj 打开CommandLineApp.xcodeproj / Swift Package Manager的库包设置了使球运转所需的一切。 它将为您提供Package.swift文件,Sources目录和Tests目录。 swift test将构建并测试您的项目,因此您可以通过命令行从根目录进行测试。 生成Xcode项目并打开它后,便可以使用⌘+ U进行构建和测试。 它会自动具有一个示例测试和主文件,供您查看它的工作原理。 打开CommandLineApp.swift文件并添加一些公共级别的代码,以便Exe可以访问它。 公共结构CommandLineApp { public var text =“您好,世界! 我已经成功创建了一个可测试的项目!” public init(){}} 现在我们有了要使用的文件,我们将初始化一个git […]