Tag: swift

雨燕:永无止境的彩虹

使用IteratorProtocol和Sequence协议创建UIColors序列 Github上的资源和游乐场 Swift IteratorProtocol和Sequence是两个功能非常强大的协议,它们允许开发人员遍历一系列值。 IteratorProtocol提供序列中的下一个值。 如果下一个值为nil,则序列将停止迭代。 它还可能包含有关迭代的状态信息。 顺序:“一种通常用于遍历for-in循环的类型”。 〜苹果。 如果您使用了Collection或for-in循环,那么您会遇到这两个协议。 但是,这些协议可以应用于集合以外的事物。 这让我开始思考: 我们还可以迭代其他一些非收集序列吗? 我想到了几个例子,最后我尝试创建一个迭代器,该迭代器生成了永无止境的UIColors序列(彩虹迭代器)。 IteratorProtocol和Sequence协议非常简单。 苹果甚至提供了两个自动包装器AnyIterator 和AnySequence ,以帮助您创建迭代器和序列。 // Rainbow迭代器和序列 扩展UIColor { 静态函数rainbowIterator(…)-> AnyIterator { 返回AnyIterator { //做一些数学运算以计算下一种颜色 return … //按顺序返回下一个UIColor } 静态函数RainbowSequence(…)-> AnySequence { 返回AnySequence(rainbowIterator(…)) } } 差不多了! 缺少的(也是最难的)是添加一种算法来查找彩虹序列中的下一个颜色。 幸运的是,Jim Bumgardner(jbum)写了一篇很棒的文章,用javascript制作了令人讨厌的彩虹,它提供了一种算法来遍历一系列颜色。 在实现了“彩虹中的下一种颜色”算法之后,我可以遍历一系列UIColors: //相移为10°的UIColors序列 let phaseShifts:[AnySequence ] = stride(from:120,through:0,by:-10).map { 让相位= $ 0.radians 返回UIColor.rainbowSequence(phase1:0,phase2:phase,phase3:phase * […]

使用Promise类型解决歧义并提高性能

最近,我们在标准银行工程部遇到了一个问题,即我们同时运行相同的服务调用。 在任何给定时间都有大量用户使用该应用程序的情况下,任何昂贵且不必要的服务调用都可能给您的后端系统带来巨大压力,并给应用程序以缓慢的感觉。 与往常一样,您可以遵循以下提供的游乐场文件: TYRONEMICHAEL /缓存的承诺 缓存的承诺–使用Promise类型 github.com 解决歧义并提高性能 描述最初的问题 我们有许多不同的功能团队。 如果我们需要特定团队的数据或功能,则该团队可提供面向公众的界面。 使用该接口的其他功能团队不在乎实现。 让我们看一个简单的例子。 这将是面向公众的界面的示例。 现在应该缓存所有服务调用,因此让我们编写一个用于缓存用户的快速接口和实现。 最后是实现公共接口的存储库的私有实现。 让我们退后一步,更详细地说明上述内容。 该实现检查缓存以查看我们是否有当前用户,如果找到用户,则返回该用户。 如果找不到用户,我们将触发服务调用以获取用户。 我们在后台线程上进行所有服务调用,从而防止任何人锁定主线程。 如果在主线程上完成了服务调用,则会引发致命的运行时错误。 提取用户后,我们将填充缓存。 您可以使用以下代码段测试上述内容。 现在,这种方法存在三个主要问题: 无法确定服务呼叫是否已触发并且尚未返回。 因此,我们可以在填充缓存之前发生多个服务调用。 如果我们看一下接口,我们不知道我们必须在后台线程上运行该函数。 是的,该应用程序将在运行时引发致命错误,但我们也不必查看实现。 最后,我们可能会意外地在主线程上调用getCurrentUser()而不是崩溃,因为缓存已被填充。 这是我们需要解决的三个重要问题。 使用Promise解决问题 在开始解决方案之前,重要的是要提及结果类型。 我在我的很多文章中都提到了它,但是基本上一个应用可以处于两种状态之一,即成功状态或失败状态 。 维基百科很好地总结了它。 结果类型提供了一种优雅的错误处理方式,而无需求助于异常处理。 当可能失败的函数返回结果类型时,程序员必须在获得预期结果之前考虑成功或失败的路径; 这消除了错误的程序员假设的可能性。 现在,程序可以进入另一个状态。这就是Promise Type的出现。Wikipedia再次很好地总结了Futures和Promises。 Promise and Futures描述一个对象,该对象充当最初未知的结果的代理,通常是因为其值的计算尚未完成。 基本上,您可以将Promise视为未来的结果 。 因此,更正我之前的陈述,程序实际上可以处于以下三种状态之一: 成功状态 失败状态 等待/未知状态 有很多框架和库影响了Promise或Future Type,但我专门使用Google的框架和库。 通过更新我们的界面: 至: 我们消除了所有歧义。 我们不再需要查看实现以确定是否必须在后台线程上运行该函数。 […]

简短有趣:启动屏幕

如果您选择创建一个启动屏幕,则会在加载应用程序时立即显示启动屏幕。 它给人的印象是您的应用程序快速且响应迅速。 我们都看过它们,如果您要创建iOS应用程序,则很有可能会使用它们。 这是有关如何创建启动屏幕以及所需内容的快速细分。 这是您需要的: 您的图片,最好是.PNG格式,而不是JPEG (下载) 资产目录创建器 -可以获取任何图像,并为您提供一组图标和启动屏幕图像。 Xcode中的LaunchScreen.storyboard 这是您需要做的: 在“常规”选项卡下,确保已选择“ LaunchScreen”文件 导航到“ LaunchScreen.storyboard” 在属性检查器下,将“ LaunchScreen.storyboard”设置为“初始视图控制器” 耽误! 你有照片吗? 如果没有,继续购买要用于启动屏幕的照片。 获取照片后,打开资产目录创建器 将您的图像文件拖放到Asset Catalog Creator中 点击“创建” 将您新创建的启动屏幕图像文件添加到您的项目中 导航回到“ LaunchScreen.storyboard”,然后在视图控制器中添加图像视图 不要忘记为此图像视图添加约束 最后,在“属性”检查器下,为图像视图设置图像,如下图所示: 现在,您应该一切准备就绪! 在运行应用程序时,启动屏幕应显示约两秒钟,然后再显示您的应用程序。 补充说明: 苹果公司表示,您不应在启动屏幕中放置任何文本,但该规则未得到执行。 您的启动应用可以动画化 您可以自定义延迟时间

与Objective-C不同的Swift功能

Flatiron已决定在程序的后半部分将重点更多地放在Swift上,因此我决定将更多精力放在这种新语言上,这将在接下来的几个月以及以后的时间里学习。 Swift具有许多我真的很喜欢的新功能,以下是其中的一些: 可读性 Swift摆脱了Objective-C传统约定。 这是什么意思? 不再需要@符号来区分Objective-C类型或与对象相关的关键字 结束行时不再有分号 if / else语句中的条件表达式不带括号 方法调用不会相互嵌套。 Swift方法和函数在括号内使用行业标准的逗号分隔参数列表。 以下是目标C的示例: 由于所有这些更改,用Swift编写的代码通常更短,更简洁,并且类似于自然的英语,从而使程序员更容易更快地采用它。 保养 Objective-C需要两个代码文件来缩短构建时间,即头文件和实现文件,而Swift则不需要这些文件,因为Xcode和LLVM(低级虚拟机“模块化和可重用的编译器和工具链技术的集合”)可以推断依赖关系并自动建立。 类型安全 使用类型安全,您可以清楚代码中的值的类型,从而避免出现诸如期望String却返回Int之类的错误。 在编译代码时进行Swift类型检查,以便您可以及早修复错误。 分配文字值时,自动指定类型,但是您需要显式指定常量还是变量。 如果您将值分配为100,则Swift会将其推断为Int;如果您将值分配为“ Hello Flatiron!”,则将因引号而将其推断为String。 选装件 当调用返回nil(uninitialized)的方法时,没有任何反应。 这可能导致许多错误。 输入Optionals类型,它通过让您知道有一个值和它为x或根本没有值来处理缺少值的情况。 游乐场 这样一来,无需创建全新的项目,即可测试代码段。 使用时,它会在右侧显示您的预期收益,并在出现错误时提供反馈或建议。 我发现这非常有用,因为它使我能够通过反复试验有效地学习概念。 尽管对于经验丰富的程序员来说,它似乎更有用,但它无疑帮助了像我这样的新手掌握了简单的概念。

充满材料设计的天空

关于Google及其给iOS UI开发人员的礼物。 我知道。 我是一名Android开发人员,应该与这个小机器人呆在一起。 但是,即使它在iOS中实现,我也无法抗拒Material Design! 几天前,我正在为我目前的公司开发一个应用程序。 我做了一个“ meh”布局(我不专门从事iOS布局,但是工作是工作,我必须安排这样做)。 看到糟糕的设计-好吧,它并没有那么糟糕,只是没有那么有趣-看着漂亮的Android对应产品,我脑海里浮现出一个疑问:“材质设计呢?”。 不久前,我尝试了一个由CosmicMind的iOS第三方库,其中包含许多MD控件(请在此处进行检查),但真诚地,它并没有说服我。 我不知道为什么,对我来说,它太“塑性”了,无法使用……也许对您来说它运行良好,所以尝试一下,也许您找到了梦想中的图书馆! 因此,我在网络上搜索了有关Big G设计范例的另一个库,然后我进入了一个GitHub存储库,这使我大为震惊:iOS的Material Components。 只有一堆星星(目前大约有六百个星星,考虑到GitHub上有许多10–20k★s项目,这并不是一个很大的数字!),但是我开始阅读其中的描述。 “由Google的工程师和UX设计师的核心团队开发。”好的,我已经在做梦了:Google员工为Material Design设计的iOS库? 我也可以用我喜爱的图形样式开发Apple产品吗? 我必须学习和使用它! 好吧,故事的结尾让我开心,就像一个婴儿用我的公司iPad跑步(嘘,别对老板说,我很好地对待这些东西🙄),向我的同事们展示了奇迹,以及一个令人惊叹且非常流畅的应用程序。 今天,我只想向您展示如何使用这个漂亮的库:我们将构建一个小的Material Design Twitter客户端(“ Pff,另外一个?!网络上有很多关于蓝鸟客户端的教程!” —是的。程序员没有想象力,我发现已经完成的Swifter Twitter-API-swift时期。 在GitHub上可以找到我写的,我在本文中谈论的Twitter客户端。

从Internet上的图像加载到您的应用程序不是很明显的问题。

DispatchQueue.main和NSCache也是您的朋友。 当您的应用程序从API加载图像并将该图像加载到数据中并在tableView中显示这些图像时,您可能会遇到图像无法正确加载以及某些图像在错误的tableview中出现的问题。 在这篇博客文章中,我将尝试确定在使用从Internet加载的图像的自定义单元格中出现的主要问题,并尝试为您提供一个简单的本机(也是原始的)解决方案。 将您的gif滚动得非常快,并在此处他妈的tableviews。 您的图像闪烁并被分配到错误的单元格。 当您使用本机swift方式将图像加载到tableview时,它会触发您的应用用来下载图像的新数据线程,(如果您不熟悉线程的概念,这是对并发和多线程的很好的介绍作者:Bob The Dev)加载图像后,需要将图像分配给相应的UIImageViews对吗? 因此,您只需在数据下载完成后立即进行操作即可! 嗯……不完全正确,因为结构(或CocoaTouch)的速度如何,如果您在除主线程之外的其他线程中执行UI操作,它将大吼大叫。 那么如何避免编译器的愤怒呢? 您将代码重新返回到主线程上。 使用dispatchQueue,您可以返回到主线程并在那里执行UI操作。 因此要记住一个好的经验法则,所有UI操作都必须进入主线程 经验法则:所有UI操作都必须在主要方面完成。 如果这样做,编译器应停止对您大喊大叫。 但是问题不止于此。 您正在耗尽他们的数据,现在该变得聪明了。 根据代码的结构方式,您可能会在每次出现单元格时发出Web请求来获取图像,问题是,当单元格消失时,很有可能您的图像也消失了,然后当该图像需要再次显示时,电话将再次发出Web请求以获取图像,并使用用户的电池和数据。 解决此问题的方法是使用图像缓存。 NSCache在数据存储区内部。 对不起。 NSCache是​​一项功能,使您可以收集各种数据对象,可以在完成加载后将其保留在图像上,并且不再显示后,只需为其分配一个密钥即可存储它,您以后可以使用键进行检索。 因此,每次单元格显示图像时,您都可以进行代码检查,以检查图像是否已在缓存中,如果已存在,请使用缓存中的图像。 一种简单的方法是将用于获取对象的urlString分配为图像的键,这样就不必在每次下载新图像时都考虑键名称。 为了得到它,我们只需要urlString和voila的值。 结论 与UI修改有关的任何操作都需要在主线程中完成,这可以通过使用dispatchQueue.main代码块来完成。 将您下载的图像缓存在NSCache对象中,并分配urlString作为获取该对象的唯一键是一个很好的经验法则。 最后,只需添加一个代码检查,检查您是否已经具有以urlString作为键的图像,如果是,请使用该键将getObject转换为UIImage,然后使用它! 没有浪费的请求,更快的应用程序!

当我不知道Salesforce时,如何构建连接到Salesforce的iOS应用?

每隔一段时间我就会感到沮丧。 我仍然想念Parse。 它使构建移动后端变得如此容易,而且我敢说它很有趣。 是的,是的,我明白了。 昆顿,过一辈子。 继续。 像许多伟大的技术一样,不幸的是Parse不得不消亡。 不是Facebook杀死了它。 解析从未将后端连接到公司。 正是这种联系使公司能够与他们的移动应用程序客户建立关系。 没有此连接,移动应用程序就像玩俄罗斯轮盘赌。 一会儿一切都好,然后ba! 最终,这个对业务至关重要的应用最终以致命的一击沉入了应用商店DEAD中。 作为我在Salesforce工作的一部分,我与许多企业讨论了如何构建移动应用程序,从而避免了断开连接的应用程序的命运。 到目前为止,大多数人都知道我们称为App Cloud的平台。 他们可能为员工构建了自定义应用程序,但是在构建本机应用程序时,他们没有内部技能。 现实情况是,除非该公司是旧金山湾区的一家科技公司,否则他们可能没有一支消费移动应用程序专家团队。 他们将这类工作外包。 Salesforce到底是什么? 我是本地人,主要关注Apple生态系统平台:iOS,MacOS,TVOS和WatchOS。 我们使用诸如Xcode,Cocoapods之类的工具,并且喜欢Swift(虽然泰勒·斯威夫特确实写了一首吸引人的歌曲,但他并不喜欢泰勒·斯威夫特的综艺)。 将客户线索添加到Salesforce 抓住Leads-SDK cocoapod,在情节提要中添加一个按钮,将其类型更改为LeadsButton,然后询问客户其Salesforce组织ID(不用担心,他们会知道您在说什么。) 豆荚“ leads-sdk” 然后捕获客户信息: var d:Dictionary = [String:String]() //填充标准字段 d [Leads.StandardFields.FIRST_NAME] =“奎顿” d [Leads.StandardFields.LAST_NAME] =“墙” d [Leads.StandardFields.EMAIL] =“ quinton@here.com” d [Leads.StandardFields.COMPANY] =“ Salesforce” d [Leads.StandardFields.CITY] =“旧金山” d [Leads.StandardFields.STATE] =“ CA” myLeadButton.formFields […]

使用表情符号创建iMessage应用

然后,我们需要为我们的项目选择名称。 设置好应用后,我们将看到以下内容: 构建我们的BrowserViewController 我们需要创建视图控制器以显示所有令人惊奇的表情符号。 我们去创建一个EmojiBrowserViewController.swift并按如下所示进行设置。 好的,现在我们有了一些贴纸和浏览器,让我们连接浏览器以查看表情符号。 我们将贴纸保存在数组[MSSticker]中。 我们创建一个函数来创建标签,例如附加到标签数组。 最后,我们创建一个函数来加载贴纸。 在这里,我们遍历资源并找到png(我们的贴纸),然后将它们添加到MSSticker数组中。 最后,如果您想完成整个项目,可以在Github上进行检查。

‘功能性’Swift#5:JSON提取和解析

在前面的部分(1、2、3、4)中,我们已经看到了如何将一系列保护语句重写为简单的函数链,并将其扩展为返回Result类型。 在本文中,我们将使用相同的技术(使用可选版本)来获取和解析JSON文件。 首先,我们需要JSON: [ { “ title”:“ Title1”, “字幕”:“ Subtitle1” }, { “ title”:“ Title2”, “字幕”:“ Subtitle2” } ] …以及解析为…的类型 结构项:可编码 { var标题:字符串 var副标题:字串 } 请注意,该结构被标记为符合Swift 4 Codable协议。 现在,让我们为文件路径提供一个帮助程序类型(并非绝对必要,但我认为它使我们正在处理的类型更加明确): 结构文件路径 { private(set)var值:字符串 init?(在捆绑包中:Bundle = .main, ofType fileExt:字符串=“ json”, 命名名称:字符串?) { 守卫让路径= bundle.path(forResource:name, ofType:fileExt) 否则{return nil} self.value =路径 } } 现在我们可以构建我们的展开函数: 结构展开 { typealias StringToData =(字符串)->数据? […]

加快iOS开发-XCode Inject插件

使用XCode的注入功能,您可以欢喜快乐,而无需完全重新编译即可刷新iOS代码。 编辑一个ViewController,重新加载更改,立即查看结果!!! 如果您不相信我,请亲自看看。 任何开发周期中最无聊/最无用的部分之一就是等待您的项目进行编译。 而且,如果您已经完成了iOS开发,您就会知道XCode浪费了多少时间来重新编译项目。 即使编译时间较少,您也必须遵循一系列的轻敲,长按等操作才能达到所需的应用程序状态,甚至无法测试更改。 该插件将大大减少减少这些步骤。 更改代码时,可以使用此XCode插件注入新的类定义。 它重新编译刚刚更改的文件,并将其注入实时运行的应用程序中。 很棒的是,它也适用于真实设备。 设定 为XCode安装Alcatraz软件包管理器。 Alcatraz允许您轻松安装和删除XCode插件 在项目菜单中使用带有软件包管理器选项的Alcatraz打开。 搜索注入插件,然后安装它。 安装后重新启动XCode 要使其在真实设备中工作,您需要单击产品->注入插件->注入补丁项目 。 它将在您的项目的main.m中添加几行。 如果这是一个快速的项目,只需创建一个空的main.m并执行上述操作。 注入代码 运行您的项目,对文件中的代码进行一些更改,然后按^ + =。 您在该文件中更改的代码将被编译并实时注入到应用程序中。 现在,您只需要以某种方式使您的程序创建更改后的类的新对象即可查看更改。 例如,点击返回按钮,然后再次进入视图。 可以注入的内容几乎没有限制,请参阅XCode的github项目的Injection。 目前,有一个小的限制是,由于XCode的限制,如果您的项目中的源文件超过128个,它将无法正常工作。 在github问题跟踪器中关注此问题和其他问题。 您还可以通过在产品->注入插件->可调应用程序参数中启用File Watcher来将其设置为自动注入更改 如果要在注入更改时使更改可见,则必须修改常规代码。 您必须在注入后监听回调,然后重新加载视图或执行其他操作。请阅读说明。 该插件将为您的项目添加一个新文件夹,您可以将其添加到.gitignore以避免源代码控制。 开发人员开源了它是很棒的。 要了解它是如何发挥作用的,请参见此处。作者已按照“ nagware”许可发布它,他要求您在使用两周后付款。 从我的博客转发/重写-http://saiprasanna.in/ios/speed-up-ios-development/