Tag: 开发

UIProgressView在tvOS上的性能

在过去的几个月中,我很高兴能够开发tvOS应用程序。 针对tvOS的开发与iOS非常相似,这使得从一开始就可以很轻松地进行工作。 在对其中一项功能进行多次迭代之后,我们偶然发现了其中一种集合视图带来的性能下降。 在Instruments上花费的时间揭示了我们可以应用的许多潜在优化,其中包括为我们的集合视图缓存布局属性,对我们的滚动算法进行进一步的优化等。所有优化为除了一个不需要的集合视图之外的所有内容都提供了出色的结果表现良好。 除了一个集合视图外,其他所有内容均以惊人的60 fps速度运行。 这很快就变成了我的爪子上的荆棘,我开始执行一项任务以弄清为什么会发生这种情况。 我没有指望单击Xco​​de中的“配置文件”按钮的次数。 我开始剥离UI元素,更深入地了解配置文件堆栈,最后我在针对tvOS优化的黑色犯罪故事中遇到了一个嫌疑犯。 所有证据都表明, UIProgressView是罪魁祸首。 现在我们终于发现了一个很大的弊端,是时候该弄清楚如何解决这个问题了。 但是在我们进入解决方案之前,我想提出一个我的理论来说明为什么会这样。 因为我不知道UIProgressView的内部工作原理,所以我无法将我的理论作为事实提出来,但是如果您继续研究,我认为您会同意这是有道理的。 我最初认为这是Apple的错误,并且打算提出警告,但是经过更多的考虑,这更多的是Apple提供的实现成本,这使我们不适合在这种情况下使用。 话虽如此,我们没有在新的Apple TV上看到相同类型的帧丢失,这意味着随着时间的流逝,此问题将自行解决。 我们不能只是坐下来等我们的用户升级硬件,因此我们推出了自己的解决方案,该解决方案将更适合我们的需求,并以我们想要的方式扩展。 由于UIProgressView旨在在尽可能多的情况下工作,因此Apple选择了UIVisualEffectView 。 我知道这个选择; 不幸的是,如上所述,这并不能很好地扩展,因为我们一次显示了十到十一个视图,所有视图都使用了此实现。 根据设备的不同,它可以使帧丢失达到20 fps或更高。 另外,我们的设计不必依赖UIVisualEffectView,因为我们添加了渐变以确保进度视图始终对用户可见。 您可以说Apple提供的原始实现针对我们的用例进行了过度设计。 可能还有其他原因导致它对我们而言效果不佳,我们用来解决该问题的解决方案是制作自己的进度视图版本,该版本不受UIVisualEffectView的支持。 因为我们希望它可以替代UIProgressView ,所以从UIProgressView复制了公共API。 它使开始使用视图变得更加容易,因为我们只需要更改要使用的类即可,而不必更新对该类进行的所有方法调用。 我们的替代产品包括两个CALayer ,一个外层代表总进度,另一个内层代表当前进度。 外层的拐角半径等于进度视图高度的一半; 这使它具有与UIProgressView相同的形状。 对于动画,当我们调用setProgress(_ progress:Float, animation :Bool = false)时,我们将提供一个CABasicAnimation ,并将其添加到内层。 由于CALayer缺乏使用约束的能力,因此将图层和动画包裹在常规的UIView中 ,使其更易于使用。 将这个新的进度视图放入我们的应用程序后,我们的应用程序再次开始达到60 fps,用户获得了他们应有的性能。

不要使用Swift,YET编写框架/库。

仅供参考。 如果您的框架/库是开源的并且将作为源代码发布,则可以跳过此文章。 Swift是一种年轻而强大的语言,自从2014年WWDC宣布以来,发展迅速。作为iOS应用程序开发人员,我将使用Swift构建的应用程序提交给App Store后就从Objective-C切换到Swift。 但是用Swift制作框架而不是应用程序仅几个月,我遇到了一个严重的问题。 “使用Swift X编译的模块不能由Swift Y编译器导入:” 这是令我沮丧的问题。 我的框架是封闭源代码,因此我将代码编译并打包到框架中,然后移交给客户。 但是一些客户报告说由于上述错误,他们无法使用我的框架来构建他们的应用程序。 深入研究问题之后,我意识到除非应用程序的构建环境(Swift版本和Xcode版本)与Swift框架所构建的构建环境完全相同,否则无法对其进行编译。 那是因为Swift尚未在ABI上稳定。 Swift尚未在ABI上稳定。 ABI(应用程序二进制接口) 您听说过ABI吗? 坦白说,我还没遇到这个问题。 那么,什么是ABI? ABI是应用程序二进制接口。 您必须熟悉什么是API(应用程序编程接口)及其用途。 ABI是API的低级版本,它定义了两个二进制模块之间或通常在问题及其操作系统之间的接口。 与API相比,这是对ABI的很好解释。 简而言之,通过在OS中具有稳定的ABI,为较早版本的OS编写的程序仍可兼容并在较新版本的OS中运行。 但是Swift不是ABI稳定语言,这意味着Swift标准库没有嵌入OS中。 而是将它们嵌入每个应用程序中。 您可以在Xcode构建设置中看到“ Always Embed Swift Standard Libraries选项,如果在Objective-C项目中启用此选项,则应用程序的大小将增加几兆字节。 因此,通过要求在每个应用程序中嵌入Swift标准库,即使Swift不是ABI稳定的,iOS应用程序也可以避免兼容性问题。 Swift 5有望具有ABI稳定性 为什么Swift无法稳定ABI? 这是因为Swift仍然是一种过早的语言,它通过频繁的版本更新来进行许多更改和验证。 如果该语言在太早的阶段就定义了它的ABI,那么就不能以这种方式迅速地开发和改进它。 但是在今年,随着Swift 5的更新,它有望为ABI稳定做好准备。 之后,我们可以使用Swift自由编写框架,库和SDK! 好极了! 我的解决方案? 遗憾的是,我没有时间等待Swift 5🙁我可以做出3种选择。 为每个客户的构建环境构建框架 将其设为开源并按源代码进行分发 用Objective-C重新编写 我的选择是? 第3条。将Swift代码重新编写到Objective-C并不是一件繁重的工作,但是切换回旧的和缺乏安全性的语言感觉很糟糕。 实际上,我在翻译工作中没有犯错。 将为此写单独的帖子。 TL; DR Swift正在开发尚未稳定的语言。 因此,您不应使用Swift编写框架/库,因为它可能与客户的应用程序不兼容。 […]

我们正在招聘新的中高级iOS开发人员!

加入一个由才华横溢和有趣的个人组成的国际团队。 关于方克 Fonk是一支以设计为导向的产品团队的国际创意团队,所有团队都致力于改善日常生活。 我们的使命是凭借我们的创造力,专业知识和企业家心态来改善世界。 为此,我们为令人惊叹的合作伙伴(从初创企业到公司,从图书馆到银行)提供数字产品。 无论大小,我们都爱他们。 职位描述 Fonk正在寻找一个熟练的iOS开发人员,他热衷于创建强大,创意和有趣的应用程序。 您将需要良好的软件工程技能和扎实的人际沟通能力。 您将负责我们iOS产品的技术设计和开发。 您将需要与一流的设计师和同行开发人员合作。 您在选择技术解决方案时应该有一个开放的视野。 例如,我们目前正在探索将Flutter用于Android和iOS开发。 要求 必须: 3年以上iOS开发经验 精通Swift,iOS平台和框架组件 编写单元测试的知识 对iOS的现代架构有扎实的了解 像素完美的眼睛,从技术上翻译精美的设计 通过API访问数据并在本地存储数据的知识 渴望学习和探索 渴望与团队分享您的知识 擅长的技能: RxSwift TDD知识 MVVM 我们提供什么 全职(或兼职)工作 通过重要项目使世界变得更美好的机会 一个充满创造力和启发性的国际团队,由才华横溢和有趣的个人组成 开普敦最好的午餐 我们高度重视公司的多元化,因此我们鼓励具有不同背景和各行各业的申请人提出申请。 将您的申请发送至ludo@fonk.capetown 请附上您的求职简历和申请此职位的动机。

处理iOS推送通知:不太明显的一面

在Fenrir,我们的许多开发人员都有维护已存在一段时间的应用程序的经验。 由于其中一些应用程序的规模,通常需要支持较旧的iOS版本。 当您还考虑到迁移中的小错误可能会影响成千上万的人这一事实时,就必须了解代码的内容。 推送通知是由于需要设置而难以测试的技术之一。 由于推送通知已经存在了一段时间,因此本文将不讨论如何实现它们。 取而代之的是,它将尝试阐明有关推送通知的各个方面,这些方面对于新来者可能并不那么明显,或者甚至可能被某些资深人士忽略。 其中之一是实际调用每个处理程序方法的时间。 必须先正确配置两件事,然后才能接收推送通知。 设备功能 该应用必须指定其支持的功能。 要接收推送通知,必须打开“推送通知”功能。 也可以打开的另一个功能是“远程通知” 。 可以在“背景模式”组下找到该应用程序,并允许您的应用程序在后台启动,以响应其有效负载包含“内容可用”标志的通知(也称为静默通知)。 设备令牌 获取设备令牌是必要的,以便您的服务器可以使用它来通过Apple的分发系统发送通知。 可以通过调用以下方法来检索设备令牌: 它将在您的AppDelegate方法中返回适当的响应。 但是, 调用此方法的时间取决于当前设置的设备功能。 也就是说,如果您没有启用“远程通知”功能,则必须先征得用户许可才能显示警报,然后才能检索设备令牌。 但是,如果打开,则可以随时检索设备令牌。 使用以下方法可以要求用户授予许可。 在iOS 10之前,使用UIApplication方法: registerUserNotificationSettings(_ 🙂 从iOS 10开始,使用UserNotifications框架方法: requestAuthorization(options:completionHandler 🙂 setNotificationCategories(_ 🙂 经常被忽略的是实际上有两种类型的推送通知。 “警报通知” 这些通知用于警告或通知用户某些事情。 它们可以包括警报,设置徽章甚至播放特定的声音。 仅需要“推送通知”功能。 检索设备令牌之前,需要用户的许可。 它们的有效载荷与此类似(示例摘自Apple文档): { “ aps”:{ “ alert”:“您收到了电子邮件。”, “徽章”:9 “声音”:“ bingbong.aiff” }, “ acme1”:“ bar”, “ acme2”:42 } […]

进入科技世界:转变职业的技巧

Viviane Chan是CBC的iOS应用开发人员。 (Ashar Shoaib / CBC) Viviane Chan的iPhone极大地改变了她的职业生涯。 Viviane,现为CBC iOS Apps开发人员,曾任建筑设计师。 她与客户见面,寻找解决方案并监督从设计到施工的项目。 但是她手掌上的小型设备有一些特别之处,这启发了她改变方向并为自己找到了一条新路。 她回忆说:“我意识到,这种设备将对我们对自然和公共空间的感知产生深刻的变化,它将改变我们的行为以及我们获取信息的方式。” “向手持技术的转变令我着迷; 我想成为其中的一部分。” 当Viviane开始转行时,她几乎没有编码经验。 她通过阅读书籍和博客,访问lynda.com和raywenderlich.com上的课程以及在Lighthouse Labs参加iOS Bootcamp进行了很多自学。 自换档以来,Viviane在CBC担任了职务,她得到了一位导师的技术指导,导师对此提供了极大的帮助。 您可以在这里看到Viviane最近关于她如何构建增强现实原型的一些工作。 我们强调Viviane的道路,因为尽管她的处境可能是独特的,但她的建议却是普遍的。 用她的话来说,这是薇薇安(Viviane)关于改变职业的建议: 识别何时需要继续前进 您需要对即将要做的事情充满热情,并且需要准备进行重大更改。 对我来说,选择很容易。 我觉得我已经完成了我以前的职业生涯想要实现的目标,并准备进行一次新的冒险。 注意财务挑战 财务稳定是职业转变的重要组成部分。 在过渡阶段,您将不得不考虑继续教育的成本和收入损失。 如果您是职业中期,您可能赚到了一定数量的钱,可能要花一些时间才能回到同一水平。 在获得一定程度的经验和技能之前,您不会在技术上赚很多钱。 了解您的工作与生活平衡将被颠倒 我是两个女孩的妈妈,这让我很忙。 我与家人交谈,并告诉他们,我四个月都无法工作,学习和求职。 对我而言,重要的是,他们了解我正在经历人生的转型,需要他们的支持,但这只是暂时的。 我非常感谢我的家人在过渡期间加倍支持我。 回顾过去,我很高兴为我的孩子们树立榜样-向他们表明,女性可以从事令人兴奋的科技职业并拥有家庭。 通过专注和努力,您可以实现任何想要的事情。 准备不舒服 您可能刚刚辞去了一份薪水不错的工作,并得到舒适和尊重。 现在,您将成为会议室中最不了解的人。 在您生命中的这个阶段,这很奇怪和尴尬,但同时,这是暂时的。 接受失败的希望 您正在做出巨大的改变。 这是新事物,不能保证,但是您需要对此表示满意。 您可能会失败,也可能会成功。 归根结底,斗争是真实的,但这也是暂时的。 如果坚持不懈,您将克服挑战并实现长期目标。 CBC的数字产品挤满了以有趣甚至有时令人惊讶的方式找到我们的人。 如果您想了解更多关于我们的空缺职位的信息,可以在这里阅读更多内容。

iOS图表:自定义Y轴值

尽管我对iOS图表还很陌生,但是我在其中进行了大量的工作,并且接触到它的许多不同方面。 从自定义轴值格式器和数据集的简单端到更复杂的概念,例如自定义条形图,组合图以及其他图表和渲染器。 本文特别关注一个简​​单的主题,源于我在iOS图表GitHub页面上看到的有关自定义y轴标签的最新问题。 这个问题并不是最复杂的。 但是,我希望有人被卡住,他们会偶然发现本文,并为他们指明正确的方向。 让我们开始吧。 惊喜! 在本文中,我们不会讨论如何设置iOS项目。 如果您还不知道如何操作,请搜索Medium,我相信有很多很棒的文章可以帮助您入门。 这的主要任务比您想象的要容易得多。 只需创建一个新类,使其符合IAxisValueFormatter ,并实现所需的stringForValue函数即可。 在stringForValue函数内部,您将在其中处理有关如何格式化轴标签的逻辑。 使用自定义轴格式化程序可能会很有创意,因此我敦促您熟悉它们,并看看它们可以为您做什么。 在此示例中,我们将假设我们的数据集仅包含0到4的y值。 我们的格式化程序将转换我们的y值0–4,并将其显示为从“ 强烈反对”到“ 强烈同意” 。 一致性 让我们从创建我们的类MyCustomAxisValueFormatter并使它符合IAxisValueFormatter 。 如您所见,我们有一个必须解决的错误。 我们必须实现stringForValue以满足IAxisValueFormatter协议要求。 实现stringForValue 如前所述,这是我们要返回要在轴上显示的特定值的字符串的地方。 让我们从简单地返回值的整数作为字符串开始,以了解该方法的工作原理。 添加自定义逻辑 接下来,我们将创建一个枚举来代表我们的价值观的不同状态。 这将提供一种表示我们的值的方式,并在y轴上为标签提供一个字符串。 现在我们有了带有Int rawValue的枚举,我们可以将我们的值转换为Int ,初始化一个AgreementRating ,然后使用该等级设置轴标签。 注意:为简单起见,我忽略了错误处理,因为我保证值为0–4。 但是,在现实世界中, 请勿强行打开包装并忽略失败的可能性,否则您的应用程序可能会崩溃。 配置图表轴 作为确保图表仅显示这五个标签的最后一步,我们需要在左轴上设置几个属性。 在那里,您拥有了! 带有自定义y轴标签的图表,其呈现的不仅仅是一个简单的整数/双精度值。 (是的,这是带有圆条的条形图的自定义实现。可能很快就会出现!) 现在,我们已经看到了如何创建自定义轴值格式化程序,并使用它来显示与简单数字值完全不同的字符串。 对于x轴和y轴,这些自定义格式器的功能可能非常强大。 感谢danielgindi提供出色的iOS图表库。 去看看GitHub仓库! 链接资源。 iOS图表-https://github.com/danielgindi/Charts

一便便💩

使用Cloudkit,以及在iOS和Swift中进行本地化 因此,我的最新应用程序在8个月内就淘汰了8个应用程序(现在我最多有6个应用程序,其中3个贴纸包为1个,所以我提前了)。 我想要通过这些应用实现的部分工作是学习新知识。 到目前为止,我的冒险经历是我使用Photos和HealthKit以及其他我以前不曾使用过的组件。 对于下一个应用程序,我决定看一下CloudKit。 跨设备同步总是给开发人员带来痛苦,尤其是当您不想创造糟糕的体验并且用户期望这些东西能够正常工作时。 我最新的应用程序非常简单。 尽管我和我的朋友都长大了,但我们仍然有愚蠢的一面。 有时候,我们可能会为年轻时的歌曲键入歌词,或者只是发送表情符号。 为此,我构建了“一堆便便”,这是一种创建单个字符或整个短语(如合唱)重复的简单方法。 第一个版本现已发布,但我已经开始着手进行下一个更新,即cloudkit集成。 我不确定它会多么复杂,但实际上非常简单。 通过开发门户网站创建容器后,创建记录很简单,就像创建对象和调用保存方法一样。 与典型的关系数据库不同,不需要预先定义“方案”。 当创建“ recordType”的对象时(从关系的角度来说,这可以是您想要称为“表”的任何对象)。 然后保存对象会自动创建架构。 您可以在Container仪表板中定义不同的索引,但是会为您创建一个唯一的ID。 让容器= CKContainer(标识符:AppConstants.containerIdentifier) 让db = container.privateCloudDatabase let record = CKRecord(recordType:“ MyRecordType”) record [“ text”] =“某些文本”作为CKRecordValue db.save(record,completeHandler:{记录,错误 如果让err =错误{ // print(err) } }) 您可以访问3种类型的容器来保存数据。 公共-公共容器正好在罐头上写着。 上市。 使用您的应用的任何人都可以访问任何记录。 苹果免费提供大量空间。 私有–私有容器对用户是私有的,并且使用他们自己的iCloud存储空间。 即使作为应用程序的开发人员,您也无法查看他人的私人记录,只能查看您自己的记录。 这是一件好事! 这表明苹果非常重视隐私。 共享–共享容器再次非常明显。 它们基本上是私有容器,用户可以在其中允许其联系人的特定子集查看和编辑相同的数据。 一个简单的例子可能是同一家庭成员之间共享的待办事项清单。 检索记录也非常容易。 基本上,您可以定义要检索的recordTypes并调用适当的方法。 实际上,它是如此简单,我不知道为什么我没有更早开始使用它。 我正在认真考虑重新访问一些较旧的应用程序并集成Cloudkit。 […]

成为中级iOS开发人员的提示

中级是标签。 对不同的人意味着不同的事情。 这篇文章非常主观,但是这些对我进步到我认为是中级iOS开发人员有帮助。 它还假设您已经对UIKit,协议和泛型之类的基本知识已经有了足够的了解,因此我不介绍这些内容。 学习高级iOS技术 从本质上讲,这是非常主观的,但是我建议您理解或至少意识到的事情是: 何时(以及如何)使用线程 CI和自动化工具(Fastlane,Jenkins,Travis或类似工具) 测试—单元测试,集成测试,UI测试,快照测试 如果可以访问,则App Store可以连接。 分发到TestFlight和App Store,用户和角色,证书和密钥都是好东西 帮助您遵循SOLID原则的抽象,例如Coordinator模式,这些概念将迫使您更好地构建代码。 通过实验找到最适合您的方法很重要 可访问性是大多数人会忽略的东西,因此这是与众不同的好方法。 当然,这对于您的用户也是正确的做法。 动态类型是您最容易使用的一种,也许是最广泛使用的一种。 配音和色盲设计也是不错的起点。 何时使用框架。 框架是一种非常强大的工具,可以为您节省时间和金钱,但是知道何时(并且更重要的是何时不使用)是一种技能 我敢肯定还有更多,但这些都是我想到的 这里有很多东西,所以更多的是要了解外面的事物并知道何时使用它们,而不是详细地详细了解每个事物。 这样,当有人要求您做某事时,您将知道最佳的做事方式,而无需立即知道如何做。 您将能够回答“是的,这是可能的”或“我知道这个伟大的工具”,而不是“我不确定,让我研究一下”。 最好对可以实现的目标有一个大概的了解。 将来也可能会节省您的时间。 我曾经一起破解过自己的电池记录实用程序,然后发现iOS内置了该实用程序。几乎与我不了解Swiftlint自动更正功能的时间一样糟糕。 当然,在尝试做任何事情之前进行大量研究都是不可行的,但是如果您对许多有用的技术有一个全面的了解,那么您将会知道从什么开始或推荐什么。 习惯于架构模式并知道何时使用它们 习惯一种做事方式然后陷入其中是很常见的。 也许对我们第一个可行的解决方案的联系过于紧密感到不自在或感到骄傲。 MVC没什么错,但是它是最容易被滥用的,因此赢得了良好的声誉,这也许是因为它是我们大多数人开始学习的地方。 我认为在编程中很明显,知道一种以上的做某事的方法是一项有用的技能。 这不仅是了解适合该工作的工具,而且还有助于加深您对该领域的了解,并让您了解为什么以这种方式做事。 如果您想探索建筑的各种首字母缩写,那么一个很好的起点是objc.io的《 App Architecture》一书(但是我希望他们能涵盖VIPER)。 您不必在实践中使用它们。 了解通用模式及其相关的词汇表将使您更轻松地阅读他人的代码,并使选择具有比您更喜欢的架构模式不同的新代码库更为顺畅。 与设计师合作时要自以为是 您的工作是制造最好的产品。 如果您与设计师合作,很容易挑战自己完全按照规范构建应用。 但是该规范可能不适合您所了解的业务需求。 或者它可能具有一些令人愉悦的新颖工作流程,其中标准的iOS应用程序模式就足够了(Snapchat重新设计后劲)。 与设计师一起提出这些问题是您的责任,以便您可以迭代它们并最终为用户构建更好的产品。 始终确保遵循《人机界面指南》,您的设计人员可能对此一无所知。 帮助别人 您可能会骗自己以为,由于您不是该领域的专家,因此您不应该教导其他人,但这不是真的。 您不需要了解某个主题的所有知识,只需要了解比与之交谈的人更多的知识即可。 如果有机会指导其他人,则承担该责任。 您将被迫清楚地解释一些事情,从而学到很多东西,巩固自己已经知道的知识。 但是请确保知道有多少帮助。 如果仅在它们前面键入所有代码并希望他们以后再理解,那将无济于事。 这是为正确答案提供指导的问题,当它们迷路而不会故意模糊时提供正确提示。 […]

带有MVVMCross的UICollectionView节

最近,有人要求我在Xamarin.iOS上的各部分中实现CollectionView。 在该项目中,我们使用了MVVMCross。 我知道可以在iOS本机上执行此操作,因此我想到了在Xamarin中执行此操作的解决方案。 不幸的是,我没有找到示例代码,所以我不得不自己弄清楚😢 在本文中,我将向您展示如何在Xamarin上实现Sectioned UICollectionView。 尽管在示例代码中,我正在使用MVVMCross处理绑定等。这并不意味着它仅适用于此框架。 跨框架一😉 出于本教程的目的,我将创建一个书籍列表。 将有几个类别,每个类别可以包含不同数量的书籍。 我们走吧! 如果您只想了解代码,请在本文结尾处找到指向Github上的示例存储库的链接。 免责声明 在我们开始之前还有另外一件事:我认为这种解决方案不是完美的解决方案。 它是基于SWIFT代码,StackOverflow答案和其他小提示构造的。 我将所有内容放在一起并制作了样本。 为了使UI更好,我添加了FFImageLoading库,以便可以显示书籍缩略图。 逐步解决方案 介绍后,让我们继续进行一些编码。 首先 ,创建您的UICollectionView并将其添加到您的视图/页面。 基本上,此步骤实际上并不重要-您只需要添加UICollectionView。 下一步(第二步),我建议您创建ItemCells和HeaderCell 。 为了创建ItemCells,您需要创建一个派生自MvxCollectionViewCell的类。 您可以通过创建XIB文件或.cs文件来实现。 填充视图,创建绑定,然后完成。 矿井看起来像这样 如您所见,我们有一个不错的CollectionView,分为几部分。 这就是我们应该达到的目标,这就是已经实现的目标! 完善! 😇 CollectionViews与FlowLayout相结合是iOS上的强大控件。 添加页眉和页脚会赋予它们额外的功能。 使用iPad或更大的iPhone屏幕时,我总是喜欢看到它们。 它们看起来比TableViews更好,它们表现良好,而且非常易于使用。 我真的希望有人会对这篇文章有所帮助。 正如我在简介中所述,在网上找不到类似的文章,所以我决定自己写一篇。 如果您发现任何错误或不清楚的地方,请随时写评论问我。 如果您觉得这篇文章有用,请给我一些爱,然后单击下面的拍手按钮。 它使我充满动力!

Swift Beginner:如何仅在开发模式下运行代码

有时,当我们在编程时,我们希望只在开发模式下运行一些代码,例如,将API的URL从“开发”更改为“生产”,或者用测试用户和密码填充登录视图。 为此,我们可以使用#if #elseif #else #endif语句来定义条件编译块,如swift文档中所述 #if调试 usernameTextField.text =“快速” passwordTextField.text =“ swiftIsAwesome” #万一 默认情况下,此代码已从Release版中删除,您还可以使用在Target 构建设置/ Swift编译器自定义标志中定义的Xcode活动编译条件来定义自己的标志 直到下一次…