Tag: 编码

选择第二种语言:Swift To Python

为什么选择Python以及它的样子 Swift是开始工作的好方法。 我从来没有写过一行代码。 作为一个完整的编程初学者,花了13个月的时间进行设计,自学,编码,重新编码,然后启动我的第一个完整应用程序。 我为此感到无比自豪,这是人们每天都在玩的新颖游戏。 除了保持最新状态并推出新功能外,任务还很完整。 现在有这个东西。 一旦我变得根深蒂固地思考代码,就可以用这种技能来完成所有可能的事情。 在这种情况下,仅了解Swift的问题也变得显而易见。 尽管我喜欢Apple生态系统,但通过编写Swift代码,我只能覆盖50%的移动用户和不到4%的桌面用户。 我要编写的下一个软件是台式机软件。 这些是我主要为自己创建的程序,但是还有很多其他人可以从中受益。 如果用Swift编写它们,则只能覆盖4%的用户。 如果我用Python编写它们,几乎可以接触到所有人。 为什么是Python? 我可以达到更大的用户群。 有些工具在Python中可用,而在Swift中可能永远无法使用。 对我来说,那个库是Tensorflow。 有大量的稳定框架可用。 我可以为台式机,网络甚至移动设备编写Python。 不是说我会为手机编写它。 我可能不会,但是选项在那里。 您几乎要问的每个问题都已经在StackOverflow上得到了解答。 SO上的Python标签:〜596k。 SO上的Swift标签:〜100k 这需要多长时间? 比使用第一语言的时间要少得多。 几天之内,您就可以编写出基本的软件。 语法如何比较? 非常相似。 点表示法,函数参数以及您编写的许多代码看起来都一样。 空格是Python使一切保持秩序的方式。 您将不会使用方括号来打开和关闭函数或类。 这意味着,起初,一切都会看起来很杂乱。 最大的挑战是什么? 命令行。 我对命令行并不感到陌生,但是Python需要一定水平。 带有它的学习曲线可能会令人沮丧,但没有什么不同。 您做得越多,就越容易。 Python文档不那么友好,它没有像Xcode这样的强大IDE。 大多数语言都没有。 进行设置并习惯于新的IDE。 PyCharm是我的选择。 我设法从Xcode移植了大多数语法颜色设置和键绑定。 这是一个持续的过程。 如果您过于依赖UI的故事板,那么使用新语言会困难得多。 故事板可能很棒,但我建议在没有代码的情况下进行所有UI操作时,请不要使用所有UI。 编程界就是这样做的。 签出此内容以使用没有情节提要的面板,并查看代码中的布局对齐方式。 与其他IDE相比,Xcode中的自动完成和预测功能令人难以置信。 直到我开始为别人购物时,我才意识到自己有多依赖。 我输入的内容比使用Swift时要多。 我是否已经停下来质疑这是否是一个好的决定? 是。 但是到目前为止,只有一个原因。 […]

iOS 11上HEVC编码器的文件大小问题

有关此问题的原因,请参见下面的更新5! … iOS 11备受期待的功能之一是对HEVC(或H.265)编码视频的支持。 HEVC使文件大小从H.264减少了约50%,而不会降低质量。 新的编码器的初始印象在随附的相机应用程序中表现良好,但将视频编解码器设置为HEVC时,AVASsetWriter使用的编码器似乎存在问题。 要查看该问题,请在此处克隆或下载我的Git存储库。 另外,如果您有一个已经使用其他编解码器将帧写入视频的项目,只需将使用的AVVideoCodecKey替换为AVVideoCodecType.hevc(在较早版本的Swift上为AVVideoCodecHEVC),如下所示: 在比较使用HEVC编解码器与H.264进行输出的文件时,我已经看到,使用HEVC进行输出的文件的大小大约是使用H.264进行编码的文件的三倍,而质量似乎是相同的。 我已经向Apple提交了错误,并且在收到他们的来信后会更新此帖子,但是与此同时,如果您需要使用AVFoundation逐帧编写,我建议不要跳入使用HEVC。 更新:此问题在iOS 11.0.1中仍然存在-HEVC编码文件的文件大小仅是H.264编码文件的三倍多。 更新2:在iOS 11.0.2中仍未修复 更新3:在iOS 11.0.3中仍未修复 更新4:在iOS 11.2中仍未修复 更新5:根据Brad Ford的说法,问题是HEVC编码器的默认比特率(30兆位)比H.264编码器的默认高得多(5mit)。 尚不清楚这是为什么,并且从文档中看不出来,但是需要更多细节才能了解哪种比特率可以提供两种不同编码器可比的质量。

Swift解决方案:复合

复合模式涉及集合和单个对象的树层次结构。 在上面的插图中,我们有一个文件夹和mp3的目录。 文件夹仅包含文件数组。 每个文件夹的集合可以包含mp3和其他文件夹的混合。 该插图很好地对应于我们定义的每个部分: 层次结构->目录 收集对象->文件夹 单个对象-> mp3文件 它允许客户以相同的方式对待每个层次结构元素。 层次结构中的所有文件共享一个公共接口,而不管它是文件夹还是mp3。 例如,mp3和文件夹都是可以重命名,移动和复制的文件。 因此,可以合理地期望符合要求实现类文件行为的协议。 重要的一点是,客户可以统一对待小组和单个部分。 在使用每个文件之前,无需经常对其进行类型检查。 这是使元素派生自相同协议或基类的直接结果。 UML 组件 :为集合和单个对象提供公共接口的抽象。 树中的所有元素都必须派生自组件协议或基类。 基元 :以前称为“单个对象”。基元只是树中不包含子级成分的成分。 Composite :以前称为“集合对象”。Composite是包含组件数组的对象。 虽然Composite对象和Primitive对象共享相同的接口,但是Composites包含其他方法来管理其子级。 请注意:有几种方法可以引用我们的具体组件: 我个人更喜欢“复合”和“原始”这两个术语。接下来,让我们进入代码吧! 实作 在我们的示例中,我们将向公司部门分配奖金,最终将其发放给员工。 在这种情况下,部门和员工分别充当我们的组合和基元。 零件 protocol Payee { var name: String { get } var bonusAmount: Double { get } func receive(bonus: Double) } 首先,我们为复合对象和原始对象创建一个Payee协议。 这将是我们统一对待他们的手段。 雇员 class Employee: […]

快速提示:文档

在编写漂亮的“自我文档”代码和添加自己的解释性注释之间,代码文档始终是拉锯战。 自我记录代码始终是目标,但有时简单的注释将有助于您节省时间和精神疲劳。 为了帮助您达到适当的平衡,我们收集了一些有用的文档提示,可在您的代码库中使用。 Xcode带有方便的功能,称为快速帮助。 这是在Option + Clicking代码库时看到的漂亮的文档弹出窗口。 该文档还显示在“实用工具”抽屉的“快速帮助”面板中。 快速帮助功能通过允许您记住实际操作的实际情况,可以真正地节省大量时间。 您还可以创建自己的快速帮助文档。 在类,结构,枚举,属性,方法等上方直接以/// …或/** … */形式的注释将呈现为快速帮助。 在此注释中,您可以使用类似于Markdown的语法来编写丰富的文档,其中包括基本的文本格式,示例代码,链接,甚至是图像和视频。 有关所有详细信息,请参见Apple的标记格式参考。 当光标位于函数上时,要记住的方便快捷方式是Command + Option + / 。 这将自动为您的函数生成一个可随时填写的模板,包括参数列表和返回类型。 专家提示:游乐场具有自己独特的文档功能,包括将特殊注释( /*: … */和//: … )呈现为精美的,类似于打印的格式的能力,非常适合为您的团队或团队构建培训材料甚至用作演示媒体。 有时候,您只需要一个简单的注释即可帮助您慢走记忆或指出代码中有些棘手的内容。 以下是一些有用的约定: // MARK:可用于概述代码。 这些与属性和方法声明一起显示在跳转栏中。 它们是Swift的#pragma mark -版本。 // TODO:在标记将来的工作位置时非常有用,尤其是在布置完成当前任务所需的子任务时。 这些特殊注释显示在Xcode的跳转栏中,因此我想通过将内容包装在星号上来使其脱颖而出(例如// TODO: *** … *** )。 评论应简短而切题。 如果需要提供更多信息,请将其放在下一行的另一条注释中。 您的代码库不应堆满未完成的TODO。 我们将在短期内讨论一种防止这种情况的方法。 // FIXME:与TODO类似,除了它通常表示损坏的东西,而不是不完整的东西。 这些应该遵循与TODO类似的约定,包括不要长期坚持。 // NOTE:当留下有关某项工作原理的信息或指出特殊注意事项时,遵循的有用约定。 // […]

夏季应用开发

(反射) 今年夏天,通过“芝加哥一个夏天” , “午夜敲门”和芝加哥公立学校的CS4All ,该市的几名15至19岁的年轻人有机会从事应用程序开发工作。 支付给学生的费用是学习计算机编程,开发应用程序,然后将该应用程序上载到位于城市西南侧Gage Park高中的iPad或iPhone。 在整个叙述中,夏季工作的年轻人被描述为青年和学生,而员工则被描述为教师和教员,因为员工和老板所扮演的学习量往往比老师和老板的经历大得多。学生。 Swift和Xcode 苹果公司开发了自己的编程语言,称为Swift。 (https://developer.apple.com/swift/)学生学习了Swift,以及如何使用名为Xcode的Apple程序进行编码和编程。 苹果公司还开发了完整的课程表,他们称之为“每个人都可以编码(https://www.apple.com/ae/education/everyone-can-code/) ”,以使学生通过自己称之为的东西接触Swift一个游乐场。 在这种环境下,将指导学生学习一些编码概念,例如变量,常量,函数等,尤其是它们在Xcode中的工作方式。 还指导学生完成多项任务,例如创建 学生创建的应用程序是使用Swift在Xcode内开发的。 学生和教职员工 我们是谁? 我们是谁 谁参与了该计划? 二十名学生大部分来自Gage Park高中,周边的Englewood社区或更南端的学生,还有几名来自城市西侧的学生。 学生主要是非裔美国人以及三名拉丁裔学生。 在初步调查中,大约三分之一的学生以前从未做过编码。 一些人在可汗学院学习过JavaScript。 大多数人在以前的编码课程中只真正完成过Photoshop。 不用说,所有的学生都完全不熟悉Swift和Xcode,但是他们都对学习特别是与应用程序开发有关的学习感到非常兴奋。 每个人都想制作一个应用程序,进入应用程序商店并开始赚钱,或者他们一直说:“赚钱!” 该程序有两名讲师,可在出现故障排除需求时为学生提供帮助,并帮助学生浏览Apple的课程。 他们的任务是确保学生在遇到很多困难或混乱时能够解决问题并坚持不懈。 他们还必须想出办法,使这些材料更具吸引力并易于使用,特别是对于那些以前从未做过编码或要求大量阅读的学生来说,是必不可少的。 讲师发现了诸如Code.org之类的程序,该程序在CPS和全球范围内也广泛使用,以使青年人在不太繁重的文本环境下进行编码。 讲师还提供了有关演讲最佳实践的指导,并定期围绕工作场所礼仪问题提供咨询服务。 青年和工作人员一起工作了七个星期,目标是在计划结束时展示一些应用程序。 创建了一个小型数字社区,以通过应用程序开发解决现实世界中的问题。 入门 为便于教学,并跟踪日常活动和任务,创建了一个网站“ Summer App Development” (tinyurl.com/sumappdev) 。 在@summerappdev句柄下创建了一个Twitter帐户(https://twitter.com/summerappdev) ,以突出显示并跟踪我们在七个星期内的活动。 进行了初步调查(https://goo.gl/forms/Q2CtUuvPw85kKMmh2) ,以了解学生从一开始就在哪里使用编码和技术。 从这项调查中,我们发现大约三分之一的人以前从未做过任何编码。 最初的调查帮助我们意识到,在没有任何背景经验的情况下,学生将无法直接进入Xcode并使用Swift。 然后向该青年提供了Code.org的帐户。 成对学习时,学生在“加速课程”中进行配对编码 。 不久,学生开始创建循环,函数,然后将循环和函数嵌套在循环和函数中。 在此应简要说明设置。 学生可以使用iMac台式机和MacBook Pro笔记本电脑。 […]

可编码协议

从Objective-C到Swift的过渡当然也取得了成果-尽管有时陡峭的学习曲线和不断发展的语言性质有时可能会带来挑战。 (当然也有挫折 。多年来,iOS处理设备轮换的多种方式越少说越好!) 对我来说,在不遥远的历史中最能引起欢乐的变化之一就是添加了Codable协议。 Swift 5 刚刚发布(并获得了广泛好评),但是-在Swift 4中增加了Codable-对我而言,这是一个更加令人兴奋的发行版。 可编码协议 Codable是一个非常漂亮的Swift协议。 在Swift中(与Objective-C相反),相比于继承,它更加强调组合,使用协议在不使用子类的情况下向类,结构或枚举实例添加功能。 实现协议的类,结构或枚举被称为与该协议兼容 ,从而在该过程中获得了该协议的功能。 可编码的独特之处在于,它实际上只是可Encodable和可Decodable协议的结合的Encodable Decodable 。 一个实例可以独立地符合任何一个,但是如果它同时符合两个,那么它也是可编码的。 这些协议给我们带来了什么? 让我们来看看! 编码利益 许多应用程序的一项常见操作是从API提取内容。 例如,我们的KPCC API客户端下载文章,剧集和节目时间表数据,并将其转换为适用于应用程序的模型实例。 这是解码的示例(也称为反序列化)。 我们使用数据的序列化表示形式(在本例中为JSON),并将其转换为可以使用的形式。 我们还可以反向执行此操作,将数据编码(序列化)为一种格式,该格式可以传递回服务器或以本地缓存的形式保存到用户的设备中。 总而言之,我们得到了一个用于编码/解码的标准化系统,并且有机会删除许多样板代码。 我们的KPCC API客户端项目在很大程度上依赖于使用Codable来获取API响应,并使用它们返回本地模型实例。 基本编码和解码 符合Codable很简单。 假设您有一个结构,只需将Codable协议添加到您的结构定义中,如下所示: struct Cat:可编码{ var age:Int 变量名称:字符串 } 而已! 现在,如果您希望对该Cat结构进行编码并将其保存到用户的设备中,然后将其读回,则可以这样进行: let apollo = Cat(年龄:10,名字:“ Apollo”) 让apolloData =尝试吗? JSONEncoder()。encode(apollo) 让documentsURL = FileManager.default.urls(用于:.documentDirectory,在:.userDomainMask中)。 让fileURL = documentsURL?.appendingPathComponent(“ Cat.json”) […]

学习Swift和iOS开发第12部分:多态

在本文中,您将通过阅读有关多态的方法结束对面向对象编程的基础研究。 除了成为一个很酷的词外,多态性是成为程序员时要理解的一个非常重要的概念。 在开发人员求职面试中通常会被问到:“您能定义’多态性’吗?”我们将打破多态性的含义,含义以及它的实际方式,而不是像鹿一样大开眼界。在代码中播放。 什么是多态? 长期以来对多态性的编程定义是:“多态性允许表达某种合同,可能有许多类型以不同的方式实现该合同,每种类型均根据自己的目的。” 这可能只是教科书的定义,但是这里的基本概念是我们的代码可以以许多不同的形式出现,并且其功能可以以不同的方式实现。 这可能仍然令人困惑,没关系。 让我们构建一个代码示例,因为这样更容易理解多态。 创建一个新项目 首先,如果尚未打开Xcode,请点击Create New Playground 。 为其命名,如Polymorphism ,然后单击Next 。 选择某个位置以保存此.playground文件,然后单击“ Create以保存它。 您应该会看到类似下面的屏幕。 删除左侧的所有样板代码,但根据需要保留import UIKit 。 Creating a base Class with default functions 首先,我们将创建一个名为Shape的类,该类具有area属性和一个用于计算形状面积的函数。 将以下内容添加到您的游乐场: 类Shape { var区域:Double? func computeArea(valueA:Double,valueTwo:Double){ } } 我们的基类Shape包含了我们需要的一切-一个用于存储面积的变量和一个用于计算具有两个输入值的面积的函数。 让我们创建一个子类以继承Shape类。 为了证明多态性,我们需要做的是遵守Shape设置的“合约”,该合约具有一个calculateArea函数。 创建一个三角形子类 添加以下类,并覆盖Playground底部的函数calculateArea(valueA:valueB:) : 类Shape { var区域:Double? func computeArea(valueA:Double,valueB:Double){ } } 三角形:形状{ 覆写func computeArea(valueA:Double,valueB:Double){ 面积=(值A […]

揭秘iOS应用的编码–一个完整的新手!

我只编码过一个应用,EVER,而且我不是程序员。 我的前一个职业是从事建筑设计的设计建筑师长达11年。 作为设计了大部分生命(包括uni在内的17年)的人,我看到和记住代码的方式可能与典型的程序员完全不同。 那么我怎么看代码呢? 与典型程序员的主要区别是: 我只是在开车,而不是在学习如何设计汽车。 我不了解编程的所有概念。 就像我会说广东话,但不会读或写。 对于新手编码员来说,说话就足够了。 为什么这对非编码人员有利? 关于编码,任何人都会告诉您的最重要的事情只是开始编码。 阅读教程并了解相关理论非常好,但是作为一个新手,为什么不从头开始呢? 但是,当然不是那么容易吗? 开始一些已知的事情,尤其是像编码这样令人生畏的事情,最主要的是恐惧。 只是您会学会忍受编码的恐惧。 在代码中总会有一些您不知道的东西。 这是我了解使用Objective C进行编码的一些方法,从长远来看将为您提供帮助。 目标C是一种基于对象的编程语言。 它的意思是: 就像罐中的软糖一样,您编写的每个小脚本都是一个软糖。 一些软糖具有相同的颜色,它们可能属于同一类别,即黄色与绿色软糖类别。 此描述并不完全准确,但是对于非编码人员,请暂时忘记专家的知识! 编码软糖需要3个常规步骤。 1.初始化它,2.添加属性,3.然后将它添加到某些东西中。 而已! 例如1.启动黄豆。 2.定义大小,颜色和点。 3.然后将其添加到果冻罐中。 您的第一堂课完了! 真的,那是它的主要要旨。 当您想到编码为软心豆豆时容易吗? 当然,制作1或2个软心豆糖会制作非常非常简单的程序。 但这是一个开始。 这是一些创建按钮的真实代码: UIButton * btn = [[UIButton alloc] init]; btn.frame = CGRectMake(0,0,100,100); [btn setTitle:@“我是一个软心豆粒糖” forState:UIControlStateNormal]; btn.titleLabel.font = [UIFont fontWithName:@“ SFUIText-Regular” size:15]; [jar […]

measureBlock:性能测试如何在iOS中工作?

抬起头,我们已经搬家了! 如果您想继续了解Square的最新技术内容,请访问我们的新家https://developer.squareup.com/blog 我在Square的一个小型项目中工作,涉及iOS的性能单元测试-本质上,研究如何引入性能单元测试,我们的选择是什么以及如何在CI(持续集成)上扩展。 在关注Apple作为其单元测试套件的一部分提供的一种神奇的measureBlock方法时,问题是:它如何工作? 而且,这对我们和CI流程都有效吗? 什么是measureBlock? 对于那些不知道measureBlock,有一点背景知识:当您在XCTest编写单元测试时,可以使用一项功能来测量执行代码块所需的时间。 在Objective-C中看起来像这样: 它是如何工作的? 基础 不幸的是,在我偶然发现2014年WWDC会议的一些旧幻灯片之前,Google的业绩还很低。 本文档说明measureBlock 运行您的块10次,并计算运行块所需的平均时间。 然后将该平均值用作基线。 第一次运行测试时,它会失败,因为尚未建立基线,因为该基线是在第一次运行时计算得出的。 您可以手动修改该基准。 在随后的测试运行中, measureBlock仍然会运行您的模块10次,但这一次它将把运行时间的标准偏差与基线进行比较。 如果向上或向下的折扣超过10%,则您的测试将失败。 所有这些设置也可以手动更改。 基线与平均值 Xcode显示了一个弹出窗口,它同时显示了基线和平均值。 两者之间的区别是:平均是上次运行测试运行代码块所花费的时间。 基线是您选择的固定设置(如果不执行,则由Xcode自动设置)。 将标准偏差与基线进行比较; 弹出窗口中显示的平均值对您的测试没有任何影响。 为什么使用标准偏差 以下图表显示了给定代码块10次运行的运行时间: 平均时间为1秒。 (摘自Apple WWDC幻灯片) 现在,这是第二个图表,其中平均时间也是1秒: 显然,平均水平并不能说明全部情况。 这就是measureBlock将标准偏差与基线进行比较的原因-因为标准偏差告诉我们有关测量范围的信息。 基线存储在哪里? 因此,对于那些在多台计算机上运行CI的大公司工作的人来说,现在面临的主要问题是:基线存储在哪里? 我只是通过使用git,添加性能单元测试并查看文件diff来弄清楚这一点。 Xcode将基线存储在project.xcodeproj/xcshareddata/xcbaselines/…下的项目文件包中。 此文件夹将包含一个.plist列出给定主机+运行目标组合的所有性能测试设置,以及一个包含所有主机列表的Info.plist 。 基线特定于运行测试的主机和目标设备(例如,iPhone 7模拟器)。 Xcode生成唯一的UUID来识别组合(机器+目标),并将所有性能设置绑定到该组合。 该组合由计算机的规格定义-因此,如果您在具有完全相同的规格的另一台计算机上运行性能测试,则将拉取相同的基准(请参见下面的屏幕快照,了解用于定义组合的规格) 。 索引所有主机和目标组合的Info.plist如下所示: 这是给定主机性能测试设置的.plist的示例: 因此,当将这些检查到您的代码存储库中时,每台机器都必须具有自己的设置。 这是合理的,因为主机之间的性能会有所不同,模拟器也会有所不同。 但是,如果您在一家大型公司拥有数百台虚拟机,则可能会变得棘手。 问答环节 这是什么版本的Xcode? Xcode 9.2 您是如何找出这些人的? […]

在iOS 11中使用Codable拖放自定义类

介绍 我最近遇到了一个有趣的问题。 我为客户(学校)创建了一个mac应用程序,您可以在其中创建和管理学校提供的教师资料和科目(它们会定期更改)。 我创建的Mac应用程序具有一个带复选框的简单表格视图,您可以在其中为教师分配主题。 我正在使用Firebase进行所有操作,当它们从2.x迁移到3.x时,他们放弃了对macOS的支持。 尽管现在由于社区的巨大努力而再次运行,但我还是觉得做原生iOS应用程序是最好的方法。 解 我想创建一种将主题从一个表视图拖到另一个表视图的方法,从而将该主题分配给老师,如下所示: 但是我遇到了一个问题,我想不出将所需数据从一个表视图传输到另一个表的最佳方法。 我可以将主题的id发送到另一个表视图,但这意味着我将不得不重新获取主题或具有一些全局状态来查询。 我想要一个干净利落的解决方案。 输入: NSItemProviderReading,NSItemProviderWriting和Codable 使用这三种协议,我可以将Subject类编码为数据类型,将其作为ItemProvider传递,并将其用作UIDragItem ,然后在另一端重新实例化。 当用户启动拖动时,将发生以下情况: 表格视图将使用此方法向UITableViewDragDelegate询问UIDragItem func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] 此方法返回一个UIDragItems数组。 用一个NSItemProvider对象实例化一个NSItemProvider ,这是第一个挑战。 NSItemProviderWriting仅采用几种数据类型(NSString,UIImage,NSTextStorage,CNContact来命名),这是我们为了使我们的类创建项目提供者对象而需要采用的协议。 采用NSItemProviderWriting很容易,只有两个要求要处理。 第一个是writableTypeIdentifiersForItemProvider ,您必须在其中指定对象可以表示为哪种数据类型,并使用func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Void) -> Progress? 这是处理将类转换为上述属性中指定的数据类型的方法。 这就是Codable协议的来源。有了Codable,我们可以将对象编码为json数据对象,然后将其传递给项目提供者,然后使用NSItemProviderReading协议一致性在另一端对其进行解码。 如下所示,要使JSON编码和解码正常工作,您需要做的就是采用该协议。 显然,它有更高级的用法,您可能需要做更多的工作才能采用它,但是我将由其他人来解释。 //Subject.swift 最终课程主题:NSObject, NSItemProviderWriting, […]