Tag: 编码

是! 我正在写关于ARKit的书!

更新 :这本书现在可用! 在这里获取! 那是在2017年6月5日,Apple刚刚在WWDC 2017上发布了iOS的ARKit。如果我说我感到惊讶,我不会撒谎,因为我期望最近几年会使用增强现实框架,特别是在苹果收购Metaio时。 那天晚上晚些时候,我坐在破烂的汽车旅馆里,用疯狂的慢速wifi下载了Xcode 9 beta和iOS 11 beta。 让我谈谈汽车旅馆。 有时您可能会在高速公路上行驶时,看到汽车旅馆就在高速公路上,您会想,到底谁会住在那。 好吧,那是我住过的同一家酒店。 无论如何,几个小时后,大约在凌晨2:00,我能够在iPhone 6S上运行我的第一个ARKit应用程序。 我充满了喜悦。 我的房间里有一架太空船,我可以从不同的方向看太空船。 我爱它! 🙂 在接下来的几天里,我尝试了ARKit,并且喜欢整个框架及其提供的经验。 作为一名教育家和讲师,我开始研究有关Udemy的ARKit课程。 我很自豪地说我的课程立即成为热门课程,并且是Udemy上最畅销的课程之一。 您可以在这里查看课程。 现在,该课程的初始版本已经完成,我可以专注于这本书。 我决定自行在Gumroad上出版这本书。 这将使我能够灵活地更快地更新本书。 我将遵循精益发布模式,该模式将允许我每周发布一个或多个章节。 第一章将在下周提供。 这是本书的粗略概述(请注意,这可能会发生变化): 先决条件 你好ARKit 几何,材料和节点 载入模型 检测飞机 物理和碰撞检测 光 基于物理的渲染 好消息是您可以立即预订该书🙂使用以下链接进行预订。 为iOS开发者预购ARKit 您也可以在Gumroad上关注我,以获取有关这本书的最新消息。 https://gumroad.com/azamsharp/关注 您还可以在Twitter上关注我Mohammad Azam 非常感谢您,希望您喜欢这本书。 Azam

AlamofireCodable简介

AlamofireCodable:Alamofire的扩展,可使用Codable自动将JSON响应数据转换为快速对象。 该项目受到流行的AlamofireObjectMapper的极大启发。 安装 通过将以下行添加到Podfile中,可以使用CocoaPods将AlamofireCodable添加到您的项目中: pod ‘AlamofireCodable’ 例 要运行示例项目,请克隆存储库,然后首先从Example目录运行pod install 。 要求 Xcode 9 +,Swift 4+ 用法 给定一个以以下形式返回天气数据的URL: { “data”:{ “location”:”Toronto, Canada”, “three_day_forecast”:[ { “conditions”:”Partly cloudy”, “day”:”Monday”, “temperature”:20 }, { “conditions”:”Showers”, “day”:”Tuesday”, “temperature”:22 }, { “conditions”:”Sunny”, “day”:”Wednesday”, “temperature”:28 } ] } } 您可以按以下方式使用扩展名: 进口AlamofireCodable 让表格= WeatherForm() Alamofire.request( form.url, 方法:HTTPMethod.get, 参数:form.parameters(), 编码:form.encoding(), 标头:form.headers() ) .responseObject(keyPath:“ data”,completionHandler:{(响应:DataResponse )在 […]

学习编码是我的缓解压力

多年以来,我妻子一直在找我,以“成为一种爱好”。 没有看电视或玩游戏的东西。 但是,在一天的工作之后,准备晚餐并帮助孩子们上床睡觉-来不及了。 然后在2017年6月,在发现自己对以前从未关心过的事情感到非常沮丧后,我决定终于该变得业余爱好了。 让我失去生活的东西。 运动从来不是我一直关心的事情,所以这出来了。 由于膝盖问题,我无法骑自行车,我已经弹吉他了,家里没有空间绘画。 所以我开始编码。 在iOS的Mac上专门编码。 一个月之内,我在Apple App Store上有了我的第一个应用程序。 好的,该应用程序没有做很多事情,但是它是实时的。 这是一个简单的点击游戏,您必须在十秒钟内尽可能多地在屏幕上单击。 而已。 到目前为止,已有约50人下载了它。 如果愿意, 可以 在Apple App Store上 下载 Tap Stars 。 自从我开始编码之旅以来,我已经开发了六种非常基本的应用程序,它们可以完成所有工作,从让您猜测一个国家的国旗到将您的狗的年龄转化为人类的岁月。 妻子告诉我她不是要基于计算机的爱好,我只是想变得更好,所以问我想从中得到什么。 而已。 对我而言,编码就像在为别人读书或写作。 从根本上讲,这是对平凡生活的一种分散注意力,是一次可以立即取得成果而做一些有趣的事情的机会。

Swift中带Codable的不确定类型

可在此处找到该帖子的配套游乐场。 时光飞逝。 Swift 4.0于2017年9月发布,并且一段时间以来我们一直在享受Codable协议。 但是,我们仍有一些基础。 回想一下, Codable协议使对符合该协议的值进行编码和解码变得非常容易。 哦,它带有属性列表和JSON支持。 还记得Swift 4之前无数的JSON解码库吗? 在大多数情况下,当您声明采用Codable的类型时,编译器将完成大部分工作并合成一致性 。 如果JSON键与属性名称不匹配,则可能还需要指定CodingKeys枚举。 但是,在某些情况下有必要手动实现Codable 。 其中的一种就是使用JSON包含对象,这些对象的类型由”type”键的值确定。 考虑一个假设的Messaging API ,它支持各种附件:图像,音频等。 { “ from”:“ Guille”, “ text”:“看看我刚刚发现的东西!”, “附件”:[ { “ type”:“ image” , “有效载荷”:{ “ url”:“ http://via.placeholder.com/640×480”, “宽度”:640, “身高”:480 } }, { “ type”:“ audio” , “有效载荷”:{ “ title”:“永不放弃你”, “ url”:“ https://audio.com/NeverGonnaGiveYouUp.mp3”, “ shouldAutoplay”:是的, } } ] […]

快速稳定的离线转换

我们为需要最佳结果的公司提供了一个离线转换器。 通过允许用户离线转换其代码,我们为他们提供了速度,稳定性和安全性。 在使用大型源文件(带有100,000行代码的2.6MB .m文件!)运行测试时,我们注意到转换器的改进空间。 无论您的项目大小如何,我们都必须努力提供速度和稳定性。 大文件转换期间需要改进的一件事是性能。 我们很高兴地报告大型文件的性能提高了40倍 。 看一下转换少数ViewControllers的速度: 我们对2.6MB源文件的初步测试导致转换失败。 我们已经修复了错误,现在可以成功进行转换。 与离线转换器的改进无关,我们还添加了对NS_TYPED_ENUM和NS_TYPED_EXTENSIBLE_ENUM支持。 NS_TYPED_ENUM用于表示一组固定的可能值: //将三个交通灯颜色选项存储为0、1和2。 typedef long TrafficLightColor NS_TYPED_ENUM; TrafficLightColor const TrafficLightColorRed; TrafficLightColor const TrafficLightColorYellow; TrafficLightColor const TrafficLightColorGreen; 而NS_TYPED_EXTENSIBLE_ENUM可用于创建一组可能的值。 typedef TrafficLightColor TrafficLightCombo [3] NS_TYPED_EXTENSIBLE_ENUM; TrafficLightCombo const TrafficLightComboJustRed; TrafficLightCombo const TrafficLightComboJustYellow; TrafficLightCombo const TrafficLightComboJustGreen; TrafficLightCombo const TrafficLightComboRedYellow; 现在这两个都可以转换为它们预期的Swifty等效项:代表常量的Swift结构! 在这里尝试进行转换:http://swiftify.me/3y0lv4 如果您想尝试一下并听到更多关于我们必须提供的信息,我们邀请您安排演示。 我们很乐意讨论将项目移至Swift的各种可能性。 我们希望您喜欢我们添加的改进。 如果您有任何反馈意见,请留在下面的评论中!

在Swift中解析JSON的正确方法

解析JSON的正确方法是使用Codable。 但是Codable的问题在于,如果您有嵌套的JSON,则必须编写额外的Codable结构或编写自定义初始化程序。 这就是为什么许多开发人员选择使用诸如SwiftyJSON之类的第三方解决方案的原因。 但这就是失败的道路。 让我们对其进行修复,并结合SwiftyJSON和Codable的最佳部分来制作下一个JSON解析库。 这个主意 有两种从JSON解析嵌套结构的方法:创建额外的Codable结构或创建自定义初始化程序。 让我们考虑一下如何实现两者的自动化。 第一种方法可以通过代码生成实现自动化。 但是要获得它,要花很多时间才能使它起作用,并且您必须具有一些JSON的形式化描述。 让我们仔细看看创建自定义初始化程序的第二种方法。 简要地说,我们必须描述每个嵌套级别的编码键。 然后,我们可以使用这些编码键来创建嵌套容器。 看一下示例JSON: 让json = [ “容器”: [ “对象”:[ “名称”:“阿纳金·天行者”, “ alias”:“ Darth Vader”, “职业”:“西斯黑暗之王”, “年龄”:42岁 ] ] ] 让jsonData =尝试JSONSerialization.data(withJSONObject:json,选项:[]) 为了解析它,我们必须创建一个包含额外编码键的结构: struct Human:可编码{ 命名:字符串 让别名:字符串 让职业:字符串 年龄:整数 枚举ContainerKeys:字符串,CodingKey { 箱子容器 } 枚举ObjectKeys:字符串,CodingKey { 案例对象 } public init(来自解码器:Decoder)抛出{ 让容器=尝试解码器。容器( keyedBy:ContainerKeys.self ) 让嵌套=尝试container.nestedContainer( keyedBy:ObjectKeys.self, forKey:.container […]

创建表单以将新书添加到数据库

表单似乎很容易使用。 这是我网页上的几个框,我可以在其中输入一些信息。然后,单击提交,现在输入的所有内容都被保存,告知我在输入信息或通知时可能犯的错误。我输入的信息可能已经存在。 听起来很简单,但是进入使它正常运行所需的实际代码,就可以用您想要的所有方式本身就是另一个整体。 将一本新书添加到Web数据库时,可能需要考虑一些可能的事情。 让我们假设数据库已经构建,我们要做的就是创建一个新表单,该表单允许用户添加他们想查看的书。 您要做的第一件事是构建表单。 我将使用测试驱动开发(TDD)来确保我的表单以我想要的方式构建。 您首先需要构建一些表单代码。 这可以通过几种方法来完成。 最常见的是: 您通常会看到这种情况,但是键入所有内容可能会非常麻烦,尤其是当表单可能需要更大时。 这是我们在创建此类表单时应在屏幕上看到的内容。 记住每行代码需要的每条信息也可能很困难。 Rails 5.1.6拥有一个非常了不起的表单生成器,可以节省您的时间和键入时间,并且只需花费一半的工作和记忆即可为您完成所有这些工作。 这是我使用Rails“ form_for”方法构建的表单的示例,该方法创建了我只需要少量信息的表单。 如您所见,我需要记住的是,创建表格时我需要erb标签()中的所有内容。 第一个将是form_for。 在这个erb标签中,form_for是用于创建表单的方法。 @book是我们为其创建表单的对象。 从某种意义上说,这种读物像英语,我想为一本新书创建“ form_for”。 两个管道(| |)之间的“ f”变量将代表将存储在数据库中的信息。 对于代码行“ f.label:title”,我们将在其中存储信息的框的标签上看到。“ f.textfield:title”是用户输入标题名称的位置。 这样显示在屏幕上。 请注意,它如何为我们大写标签并将其放置在文本字段之外,以表示这是您必须输入标题的地方。 与后一个示例相比,这对用户可能更友好,因为一旦单击该字段,您将不再知道应该与该文本字段有关的信息。 这非常有帮助,但是我们遇到了一些较小的外观问题。 对于其他标签,我不喜欢它们的显示方式。 我真的不喜欢它显示“作者”,因为如果只有一位作者该怎么办。 我希望它是单数或复数。 我希望标签说“作者”,我也希望它也显示“年发布”而不是“年发布”,但是当使用“ f”作为标签传递时,我遇到了一个小问题”变量。 它需要与文本字段键匹配。 因此,如何在仍使用“ form_for”方法的同时解决此问题。 简单的答案是,我们仅使用普通标签代替“ f.label”。 这看起来像: 这同样适用于作者。 注意,我必须指定标签是“ book_year_pub”的标签。这就是我们连接到文本字段“:year_pub”中的键的方式。它们都意味着同一件事,只是做事方式不同。 我想在屏幕上显示“标签发布年”,标签标签的两个闭合胡萝卜之间。 您需要对“作者”执行相同的操作。 完成此操作后,应正确标记我们的新表格并准备接收信息。 它应该遵循以下思路: 还需要注意的是“提交”按钮。 我不需要放置任何其他有关我想要显示的信息。 Rails发挥了不可思议的作用,并根据我有书本的事实推断出我正在写书。 我提供的唯一信息是,其余的全部由我来处理。 […]

在设备上安装iOS测试版本

本简短说明描述了如何在Xcode版本10.1(10B61)中开发的iOS应用程序安装到要用于测试的iOS设备上。 请注意,您可以改为使用Xcode将应用程序安装到目标设备上,但这并不总是一种选择。 例如,如果您想在同事的设备上安装您的应用,而您没有物理访问权限,则将无法执行此操作。 转到Apple Developer网站。 在“设备”部分中添加您iOS设备的UDID。 从几个月前开始,您现在需要使用Apple Configurator 2应用程序来获取设备的UDID。 在Xcode中找到您一直在使用的开发人员证书来对您的应用程序进行签名。 记下其名称-创建配置文件时将需要它的名称。 添加与您的应用程序包标识符匹配的应用程序标识符。 例如,如果您的捆绑包标识符是“ com.mystartup.myapp”,则将其用作应用程序标识符的ID值。 创建一个配置文件。 这会将开发人员证书链接到供应配置文件。 选择“ iOS应用程序开发”类型。 选择您刚刚创建的应用程序标识符。 选择您的开发人员证书。 选择您希望针对应用程序安装的设备UDID。 给配置文件命名。 下载配置文件,然后双击它以使其在Xcode中可用。 在Xcode中,将配置文件与您的应用程序项目相关联。 禁用自动代码签名管理。 为所有签名配置选择已安装的配置文件-关闭自动代码签名后,这些文件就会出现。 生成应用。 选择产品/归档。 创建存档后,选择新的存档,然后单击“分发应用程序”。 选择开发作为开发方法。 如果要定位到特定的iOS设备,请使用App Thinning。 如果选择此选项,将减小输出文件的整体文件大小。 选择用于签署应用程序的开发人员证书(在上面已注明其名称)以及最近安装的配置文件。 创建完成后,选择一个位置来保存您的构建。 在iOS设备上安装应用程序所需的生成文件的扩展名为.ipa。 在目标设备上安装该应用程序。 安装Apple Configurator 2。 将iOS设备连接到计算机。 将.ipa文件拖放到用户界面中的设备上以进行安装。 如果一切都按计划进行,则应在轻按时启动该应用。 否则,您将遇到问题。

警卫声明迅速

该保护声明已在Swift 2.0中实现。 从那时起,有很多关于它的用法的谣言。 保护不是通用机制。 这篇文章想澄清其中一些内容,以帮助您了解何时以及何时不使用此语句。 守卫的基础 首先,让我们澄清一下为什么发明了防护罩。 让我们看一下警卫声明的形式。 警卫条件其他{ 陈述 } 老实说,它看起来很像“ if-else-statement”版本,没有if部分。 也许这就是最常见的误解的原因,因为后卫只是if陈述的反向版本。 这会使后卫变得毫无用处,因为我们可以用经典的if语句来否定条件。 那么,为什么苹果发明了警卫呢? 根据Apple的文档: 如果不满足一个或多个条件,则使用保护语句将程序控制权移出作用域。 用两个词概括他们的主要意图: 提前退出

SmallSwiftTips#01:使用分组对元素进行分组:

对于第一个SmallSwiftTips,我将从一个非常方便的新Dictionary init开始,它是init(grouping:by:) 这个新的init是在Swift 4上引入的,它有助于创建一个新的分组Dictionary 。 它需要一个Sequence和一个闭包作为输入。 请注意,此新Dictionary的关键字将是闭包的结果。 在第一个示例中,闭包的结果为Character ,因此我们将有一个新的[Character: [String]]字典。 在第二个示例中,闭包的结果中有一个Bool值,为我们提供了一个新的[Bool: [String]] 。 您也可以使用一系列自定义对象。 此代码将返回一个非常方便的新[AssetType: [Asset]] 。 这可能会很有帮助,希望您喜欢并使用它。 😁🚀