Tag: swift

面向结果的编程:使用应用函子逐步生成结果

在我以前的故事中,我们探讨了如何使用函数组合逐步构建结果。 我们构建了applyResult函数的三个变体。 将applyResult与flatMap可以使我们采用以下代码: func getTweetDetails(for userId:String) ->结果 { var用户:用户! var tweet:鸣叫! 返回getUser(with:userId) .flatMap {userData-> Result 在 用户=用户数据 返回getLatestTweet(for:userData) } .flatMap { tweetData->结果在 tweet = tweetData 返回getTweetSentiment(for:tweetData) } .flatMap {sentimentData .success(TweetDetails(用户,tweet,sentimentData)) } } 并通过以下方式对其进行改进: func getTweetDetails(for userId:String)->结果 { 让tweetDetails = curry(TweetDetails.init) 返回applyResult(of:getUser(),to:tweetDetails) .flatMap(applyResult(of:getLatestTweet)) .flatMap(applyResult(of:getTweetSentiment)) } 一个好朋友和一位杰出的工程师最近观看了Stephen Celis的一段名为Applicatives and Swift的视频。 阅读我的上一篇文章后,他建议我观看视频。 他认为,通过使用可施加的函子,可以进一步简化解决方案。 我必须承认,在完全掌握这一概念之前,我不得不看了几次视频。 这是一个非常棒的视频,我强烈推荐该视频,即使仅观看Stephen Celis现场直播整个过程。 在Playgrounds中进行实验后,我能够将上述内容简化为非常优雅的内容: func […]

iOS上的文本属性:轻松的方法

每个iOS开发人员在发现问题后都会感到a肿–他必须使用动态文本来实现标签,如下所示: 您知道您必须动手使用Apple的NSAttributedStringKeys字典,定义它们的键并附加所有这些AttributesTexts。 哦,我的……😱 然后您将开始执行以下操作: 在定义完字典之后,您将开始构建AttributedTexts,将其附加到最后将其分配给标签。 但… Xcode在Interface Builder中内置了一个漂亮的属性文本编辑器。 这让我想知道🤔 为什么不使用它,避免在源文件中对所有这些属性进行硬编码,而在xib中对其进行硬编码,而不是在您已经对许多属性进行硬编码的地方。 是的,但是我们如何在运行时动态更改这些内容? 您可以像使用静态文本生成器那样在界面生成器中构建属性文本,并填写一些占位符(例如),稍后我们将使用实际值替换这些占位符,并保留属性。 听起来不错,对吧? 2.您必须在utils文件中的某个位置定义扩展名,我将其命名为AttributeString + Replace。 我是 tapptitude 的iOS开发人员, tapptitude 是一家移动应用程序开发机构,专门为全球的初创企业和品牌构建高质量的iOS和Android应用程序。 查看我的其他帮派->

LeetCode 301 —删除无效的括号

BFS尝试删除每个(或)并检查其是否有效,条件是删除的最少数量并打印所有可能的结果。 在移除次数最少的情况下,一旦我们从队列中找到有效的字符串(如下图(2)所示),则将标志设置为“ found”,并且不再砍掉字符串。 但是为了找到所有可能的结果,我们继续检查队列中的左侧元素(3),(4),(5),因为(3),(4),(5)与(2)处于同一级别表示相同的长度。 在处理(1)时,将下一级元素(6),(7),(8),(9)放入队列中。 在发现(2)是有效的之后,队列中剩余元素的处理需要排除(6),(7),(8),(9)。 如果(6),(7),(8),(9)之一有效,则将其与(2)的长度进行比较并丢弃。 在C ++中

4行代码的iOS录音机

从Creo 2.0.4开始,新的AudioRecorder类已可用。 通过此类,开发录音机非常简单。 我们将通过在主设计板上添加AudioRecorder类(将自动创建一个AudioRecorder1实例),然后添加三个按钮来开始/停止录制以及播放录制的音频,从而开始本教程: Timer1 Action事件如下所示: 现在,我们要在Chart控件中可视化归一化的值流(从0到100)。 因此,让我们开始创建一个数据集,该数据集以后可以由我们的图表使用。 从控件列表中将DataSet对象拖放到Window1中,并将其重命名为更具描述性的AudioDataSet。 设置自定义数据集非常简单,需要填写三个事件: 行 (此事件应返回数据集中可用行的数量) 列 (此事件应返回数据集中可用列的数量) 值(行,列) (此事件应基于行/列参数返回实际值) 为了使我们的代码尽可能简单,我们的数据集将基于数组,并且我们将定义数组的最大大小,一旦超过该大小,便会从头开始重新使用数组(我们不需要历史记录图表的数据,我们只需要显示当前值)。 满足所有这些要求,我们可以从向AudioDataSet对象添加三个属性开始: r = [] (这是我们的数组) maxSize = 10 (这是r的最大大小,该值应在运行时计算(设备框架宽度/条项目宽度) i = 0 (要写入r数组的下一个值的索引) 我们还需要添加一个辅助函数以将值添加到我们的r数组中。 我们的addValue(v)方法如下所示: 需要正确配置Chart1,我将所有详细信息的描述保留在项目文件中。 这里只是一些注意事项: 数据集必须配置为AudioDataSet 必须将“图表类型”设置为“条形图”,并且必须取消选中“使用动画”复选框(我们将每秒更新此图表10次,在这种情况下动画将成为瓶颈) 自动范围必须禁用 现在,我们有了应用程序中所需的所有对象。 仅错过了最后一步,在Timer1 Action事件中,我们需要将计算值添加到AudioDataSet,然后重新加载Chart1。 Timer1 Action事件如下所示: 最终应用看起来像: 可以从我们的GitHub存储库下载Creo项目:https://github.com/creoapp/examples/raw/master/AudioRecorder.zip

面向协议的编程简介

在过去的几年中,面向协议的程序设计已经获得了很大的关注,并在Swift社区中成为流行语。 有些人喜欢它,有些人讨厌它,但实际上是什么呢? 应该解决什么问题? 它与我们钟爱的面向对象编程有什么关系? 面向协议编程不是竞争对手,也不是面向对象编程的替代品,尽管它的名称可能暗示其他含义。 这是思考非常具体的问题集的一种方法,可以帮助您创建灵活,可维护和易于阅读的代码。 应该将其更多地视为对面向对象方法的补充(实际上,面向对象编程已经在面向协议编程中纳入了许多中心思想)。 我们将首先研究协议(或接口,在许多其他语言中称为接口)如何帮助我们进行封装和信息隐藏。 看一下Car和Carrier类的以下示例: 车类{ 变量位置:CGPoint var isLocked = true 初始化(位置:CGPoint){ self.position =位置 } 公共职能转移(x:CGFloat,y:CGFloat){ self.position.x + = x self.position.y + = y } 公共功能锁(){ self.isLocked = true } 公共功能unlock(){ self.isLocked =否 } } 运营商类{ 变量位置:CGPoint var loadingCars = [Car]() 初始化(位置:CGPoint){ self.position =位置 } 公共职能转移(x:CGFloat,y:CGFloat){ self.position.x + = x self.position.y […]

如何准备在Facebook进行技术面试

自启动iOS面试计划以来,我有机会与许多有兴趣在Facebook工作的学生一起工作。 结果,我对他们的招聘过程产生了浓厚的兴趣。 与Google和Amazon类似,他们的采访“循环”以其冗长而详尽的经历而闻名。 我最近访问了他们在西雅图的新办公室,就他们如何建议候选人准备技术面试进行非正式讨论。 本文提供提示,注释和建议。 行为要点 参加Facebook的采访活动时,我的目标是掌握最新技术,并在指导他人时微调我的方法。 我很高兴学习他们的过程从三个方面进行评分。 行为阶段旨在了解候选人。 这包括优点,缺点和目标。 突出的是他们强调寻找能够证明自己如何从失败的项目或处于危险中的项目中恢复过来的人。 这些事件揭示了候选人的态度,行为和外貌,而不仅仅是提供标准的样板反应。 Facebook寻求能够表现出流行的快速失败心态并且不怕冒险的人。 最佳脚步向前 重点是看到他们的技术面试过程的现场演示,演示者/开发者在100多人的观众面前白板解决方案。 在Facebook实际的5到6个小时的采访中,大约一半的时间将花费在完成编码挑战上。 结果,强调了候选人利用时间发挥自己的最大作用。 挑战 在Facebook上,给候选人约45分钟的时间来解决每个编码问题。 考虑到时间限制,他们建议通过提出正确的问题来给人留下深刻的印象,然后在优化设计之前继续实施蛮力方法。 只要您能够详细说明它们的性能,就可以接受使用特定API或语言功能解决挑战的方法。 为了说明这一点,让我们重新讨论在创建算法以检测字符串中的唯一字符方面的代码挑战。 签名如下: //挑战:编写一个函数来确定输入的String(例如元素)是否包含所有唯一字符。 功能 isStringUnique (元素: 串 )-> 布尔 { //代码在这里。 } 与大多数代码一样,有许多可能的方法。 在本文中,我回顾了如何通过应用蛮力方法解决该问题,然后继续优化代码,使其在线性时间(O(n)或更佳)下运行。 没有讨论的是纯粹使用本机Swift API或语言功能来解决它​​。 有趣的是,这种看似简洁的解决方案也满足了我们的要求: 功能 isStringUnique (_ s: 串 )-> 布尔 { 返回s.count == 组 (s).count } 乍看之下,代码看起来很棒,但确实是最佳答案吗? 更重要的是,考虑到典型面试的压力,人们是否有能力证明或否认其效率? 现在的课程是-较少关注语法,而是通过证明您的方法来努力展示您的知识。 系统设计 […]

iOS用于iOS开发的分支模型。 与Bitrise持续集成

当我开始在目前的公司工作时,我们为iOS平台准备的设置完全在本地托管:用于回购的Bitbucket Server ,作为构建平台的Jenkins和用于分发的Hockeyapp自己实现(据我了解,从Hockeyapp是一个开源项目的过去)。 所有这些都由外部机构(开发我们的应用的机构)负责。 我被分配的首要任务之一是这些服务的内部化,以便变得独立并控制开发周期。 为了托管存储库,我们将使用Bitbucket Cloud和Hockeyapp进行分发,但是由于我们公司根本不托管任何服务器(我们的基础架构主要在AWS的保护下运行),因此不能选择照旧执行Jenkins实施。 我当时在寻找新的云CI / CD平台 。 iOS云连续集成服务器奥运是一个很好的起点。 由于我们不是在开发仅限iOS的应用,因此未考虑buddybuild。 经过研究后,两个最终入围者是CircleCI和Bitrise 。 初始步骤 我最初的选择是CircleCI,但即使我遵循了一些教程,但也无法使签名生效。 它可能比Bitrise提供更多的自定义功能,但是对于一个不知道他在做什么的人来说,像Bitrise那样拥有一个构建模块界面在这样的早期阶段是关键 。 客户服务部门也迅速回答了我的问题,这也是迁移到Bitrise的另一个原因。 在链接了所有步骤(基本上使用了Bitrise推荐的模板)之后,构建平台就可以正常工作了。 局限性 我们有三个主要工作流程:暂存,候选发布和分发。 暂存和发行候选人将在我们的develop分支中建立,而发行将在master建立。 当几个主要功能准备好以更成熟的状态集成在一起,从而触发候选发布版本时,将应用相同的方法。 从beta到release将会执行手动合并,从而生成一个新的候选版本的应用程序。 此发行候选版本可能会被发送到iTunes Connect 。 如果最终测试和审核过程令人满意,则将发布该应用程序,并进行从release到master release的手动合并, 包括带有版本号的标签 。 理想情况下 , master 分支将包含在AppStore中发布的所有应用程序版本,并带有正确标记 。 ➜git checkout主 ➜git tag v.1.2#举例 ➜git push-标签 所有不同版本都会生成两个.ipa文件,一个针对我们的暂存后端,另一个针对我们的实时服务。 为了使我们(和我们的测试人员)更容易知道哪个版本针对什么,我们分配了不同的应用程序图标,包括版本名称和后端环境: 这些应用程序已上载到HockeyApp,我们的测试人员团队可以在其中查看和下载它们。 这就是我们当前的设置。 谢谢阅读! ✌️

移动应用程序开发的五种流行编程语言

随着时间的流逝,移动技术正在迅速发展并影响着全球范围内的各个业务部门。 建立成功的应用程序开发过程需要适当的市场研究,资源丰富的规划和策略,预算等。 但是,开发人员用来构建移动应用程序的编程语言是移动应用程序开发项目中最关键的方面。 尽管看起来似乎只是选择一种语言并使用它,但是它远远超出了此范围。 选择语言之前,您必须问自己几个问题– 哪种语言可以使您的应用程序兼具功能性和高度兼容性? 哪种语言与现代移动平台最同步? 充分利用所选编程语言的最佳方法是什么? 找到这些问题的答案后,您可以从以下最流行的编程语言中进行选择,以用于移动应用程序开发。 5种流行的编程语言 的JavaScript JavaScript是用于应用程序开发的最佳编程语言之一。 这种广泛认可的语言用于应用程序开发和Web浏览。 JavaScript已成为应用开发中最常用的编程语言,因为它可以轻松地与各种平台一起使用。 该语言易于使用且易于完全控制。 所有开发人员都没有用于JavaScript的固定标准,这为不同平台之间的差异留出了很大的空间。 爪哇 Java是用于移动应用程序开发的另一种广泛的编程语言。 就Android或iOS移动应用程序开发而言,Java无疑是最受欢迎的编程语言。 代码的可重用性和可移植性使其成为最简单的选择之一。 Java使构建代码可以在多个环境,浏览器,虚拟机和不同平台中运行。 它具有巨大的开源支持,其中包含许多库和工具,可在应用程序构建过程中为开发人员提供帮助。 它还可以保护开发人员免受本机代码固有的问题,例如错误的指针使用,内存泄漏等。 蟒蛇 Python已经成为一种增长的编程语言,并且没有消失的迹象。 它可以在Web应用程序,桌面应用程序,网络服务器,机器学习,媒体工具等中找到。 Python的语言基于简单性。 它强调以易读性为重点的明确性和紧缩性。 对于学习者来说,这是一门很棒的语言,并且是理解程序开发复杂性的门户。 Python可以很容易地用于从零开始为Android和iOS软件制作移动应用程序。 的PHP 对于需要访问数据库的应用程序,PHP是推荐的编程语言。 最好用于命令行脚本,服务器端脚本和编码应用程序。 这种灵活的编程语言可以支持面向对象的开发,但无需特别关注。 作为一种开源语言,它一直在被开发。 这是用于创建电子商务应用程序和内容丰富的应用程序的绝佳语言。 此外,它易于学习,与平滑集成格外兼容。 迅速 Swift是移动开发领域的潜在游戏规则改变者。 它是由Apple创建并于2014年引入的。该语言专门设计用于iOS和OS X平台。 Swift具有开源的优势,并且非常易于学习,特别是对于已经熟悉Objective-C编程语言的程序员。 Swift避免了Objective-C的某些错误,所需的代码更少,维护更少,并且使移动应用程序的开发绝对简单。

CuteBaby:用于Swift的JSON模型生成器

CuteBaby可以从JSON字符串生成Swift模型(结构或类)。 它具有一些不错的功能,可以自定义生成的模型。 它可以从JSON推断属性的类型,例如String,Int,Double,URL和Date。 它可以处理嵌套的JSON,它将生成嵌套的模型。 它支持Swift 4中的Codable。 您可以使用Property Map指定属性名称,使用Array Object Map指定数组的对象名称,使用Property Type Map指定属性的类型 ,或者使用Enum Properties指定枚举的定义。 它还可以处理数组根JSON,它将自动合并数组中对象的属性。 它可以使用漂亮的格式格式化JSON。 它可以从URL加载JSON。 您可以拖放文本文件来创建新项目。 对于JSON: { “ id”:42 “ name”:“ nixzhu”, “推特”: { “ profile_url”:“ https://twitter.com/nixzhu”, “ created_at”:“ 2009-05-12T10:25:43.511Z” } } 它将生成Swift代码(使用Codable ): struct用户:可编码{ let id:整数 命名:字符串 struct Twitter:可编码{ 让profileURL:URL 让createdAt:日期 私有枚举CodingKeys:字符串,CodingKey { case profileURL =“ profile_url” case createdAt =“ created_at” […]

如何在iOS应用中集成图像识别

这些天实际上是“几乎不可能的”。 至少这个xkcd-strip的主题是。 在这个简短的教程中,我将介绍如何使用Microsoft Custom Vision构建CoreML模型以能够识别照片中的对象以及如何在iOS应用程序中使用它。 您需要对iOS开发和Swift都有基本的了解,然后才能继续学习本文。 首先,我们需要创建CoreML模型。 让我们开始看看如何使用Microsoft Custom Vision。 首先登录customvision.ai并创建一个新项目。 输入名称,描述,并将项目类型设置为分类 。 将分类类型设置为多标签 ,将域设置为常规(紧凑)。 选择紧凑型的原因是因为我们要将模型嵌入到我们的应用程序中。 您以后可以随时更改这些设置。 下一步是上传我们希望能够识别的对象图像,并用对象名称标记它们。 使用multilabel,我们可以在图像上使用多个标签。 当我们有大量的图像时,我们可以开始训练模型。 我们还可以通过使用快速测试按钮来测试模型是否运行良好,您可以在其中上传图像以测试图像是否与您训练的模型匹配。 获取CoreML模型 训练完模型后,我们需要下载模型并将其导入我们的Xcode项目。 要下载模型,请转到性能选项卡以CoreML格式导出。 然后,您可以将文件添加到XCode项目文件夹中,在该文件夹中将自动生成一个类以供以后使用。 设置摄像头设备并查看 我们将从创建UIViewController开始。 该视图是我们要显示iPhone相机反馈的地方。 为了输出实时视频,我们必须添加AVCaptureVideoDataOutputSampleBufferDelegate协议。 加载视图时,我们创建一个AVCaptureSession并定义一个用于向会话输入数据的设备。 在这种情况下,我们选择视频的默认设备。 我们还创建了一个AVCaptureVideoDataOutput,我们的captureSession将从该AVCaptureVideoDataOutput输出将在captureOutput方法中可用的视频帧。 我们要做的最后一件事是创建一个AVCaptureVideoPreviewLayer,以便我们可以在应用程序中预览摄像机的输出。 然后,将预览层作为填充整个框架的子层添加到我们的主视图中。 捕获视频输出 要处理输出并进行图像分类,我们必须实现由协议AVCaptureVideoDataOutputSampleBufferDelegate定义的captureOutput方法。 为了能够分析输出中的图片,我们从CMSampleBuffer中获取了CVPixelBuffer。 然后,我们需要为每个帧指定要执行的图像分析请求。 首先,我们必须使用从Custom Vision下载的经过训练的CoreML类来创建VNCoreMLModel。 您的名字将不同于_92ed7d5fe39f4438b1ef3e98e3ce80c3_1! 对于每个结果,我们检查结果是否具有足够高的置信度以及是否具有标识符。 在此示例中,我仅检查一个特定的标识符。 标识符是我们在CustomVision中添加到图像的标签。 如果我们有足够高的信心,则可以确定标识符是正确的标识符,然后停止捕获并将结果分派到主线程。 在这种情况下,我只创建了一个带有消息的简单信息窗口。 这是在iOS应用中实现摄像头,预览和图像识别所需的全部代码,并且您的应用现在可以在识别摄像头前的对象时做出反应。