Tag: 编码

使用Swift Codable进行无痛JSON解析

最近,JSON已成为最广泛使用的格式,可以在整个Internet上传输数据。 在iOS开发领域,开发人员通常会在Swift中使用JSON数据并将其用于构建iOS应用。 有一些很酷的库,例如SwiftyJSON已经可以在Swift中使用JSON数据了,这些库之所以流行,是因为开发人员不需要使用JSONSerialization处理不可读的混乱来解析JSON。 幸运的是,Swift 4作为Foundation框架的一部分引入了令人惊叹的Codable协议,并且JSON解析成为一行或两行代码。 这是Apple完全支持的解决方案,可以轻松采用。 它提供了定制功能,可以对复杂的场景进行编码和解码。 在本文中,我们将通过构建Github Information应用程序来了解如何使用Swift 4 Codable解析JSON。 在WWDC 2017上,Apple引入了Swift中的新功能,可以使用Swift Codable协议轻松解析JSON。 有关Foundation的新增功能,可以观看谈话,您可以从23分钟开始观看此新功能。 基本上,此协议具有Encodable和Decodable协议的组合,可用于双向使用JSON数据。 总而言之,Swift Codable协议为我们提供了以下内容。 使用Codable,我们可以通过编写很少的代码行将JSONObject或PropertyList文件建模为等效的Struct或Classs。 我们不必为对象中的属性编写构造函数。 全部由Codable处理。 我们只需要扩展我们的模型以符合Codable,Decodable或Encodable协议即可。 Swift的强数据类型与JSON的丢失数据类型之间的不匹配已由Swift编译器内部处理。 现在,我们可以处理Swift Data类型,例如Date,URL,Float等 复杂的JSON可以使用嵌套结构轻松建模,以提高可读性。 使用JSONDecoder解析实际JSON成为一线人 已经有许多关于该主题的文章,涵盖了Codable协议的端到端介绍。 但是在这篇简短的文章中,我们将使用GitHub API并构建一个示例应用程序来简要演示此功能。 我们将使用非常著名的GitHub API来演示此功能。 我们将构建一个简单的应用程序,该应用程序使用GitHub用户名,并在单击“显示”按钮时显示一些信息。 有一个API可显示GitHub用户的公共信息,例如,我可以使用此API端点找到GitHub帐户的详细信息 https://api.github.com/users/shashikant86 这将以JSON格式返回信息,该信息目前看起来像这样。 { “登录”:“ Shashikant86”, “ id”:683799, “ avatar_url”:“ https://avatars0.githubusercontent.com/u/683799?v=4”, “ gravatar_id”:“”, “ url”:“ https://api.github.com/users/Shashikant86”, “ html_url”:“ https://github.com/Shashikant86”, “ followers_url”:“ https://api.github.com/users/Shashikant86/followers”, […]

Swift:如何将图像放置成一个圆圈

以圆圈显示图片。 Swift 4:对于iOS,这应该显示一个圆圈。 将图像的IBOutlet拖动(按住Ctrl键并单击)到您的代码中。 cornerRadius绘制图层背景的圆角时使用的半径。 可动画的。 https://developer.apple.com/documentation/quartzcore/calayer/1410818-cornerradius clipsToBounds属性一个布尔值,该值确定子视图是否限于视图的边界。 https://developer.apple.com/documentation/uikit/uiview/1622415-clipstobounds 2.在viewDidLoad()中, 使用实例属性 layer.cornerRadius 和 clipsToBounds 。 profileImage.layer.cornerRadius = 50 profileImage.clipsToBounds = true

Swift中的局部推理

Swift是一种令人难以置信的表达和强大的编程语言。 我们将探索Swift的一些语言功能,这些功能可使您的代码更易于阅读。 更好的按钮 让我们看一下一种常见的iOS模式,该模式在按下按钮时会打印一条消息。 如果您已完成任何iOS教程,则很有可能您之前已经看过。 选择器模式用于整个UIKit ,并不一定是不好的做法。 但是,我们可以做得更好。 当选择器声明和按钮的动作之间有很多代码时,就会出现此问题。 如果开发人员是第一次阅读本文,那么对他们而言,从根本上失去对您的功能的了解是很普遍的。 这两行代码是松散耦合的。 它们要求读者在它们之间跳转以完全理解该按钮。 让我们尝试一种新方法,使用闭包为按钮分配一个动作。 不用担心-开箱即用UIKit是不可能的,但是让UIButton像这样工作很容易。 除了在一个函数中包含第一个代码段之外,我们还使用了闭包来更清楚地传达单击按钮时发生的情况。 这样可以更容易理解此按钮的功能。 为您的按键操作实现闭包非常简单。 创建一个带有action属性的自定义UIButton子类,该属性是一个闭包。 我们在内部连接按钮的选择器,并在目标函数中执行关闭。 该解决方案可以扩展为包括UIButton的其他动作的关闭,例如touchDown , touchDragExit等。 局部推理 将相关信息保持在一起可以改善本地推理。 本地推理是一种想法,使读者可以直接在代码前面理解代码,而不必去探索代码的工作原理。 在WWDC 2016上,Apple工程师作了题为“ UIKit Apps中的协议和价值导向的编程”的精彩演讲,讨论了本地推理的概念。 他们的演讲涵盖了协议以及如何利用其优势超越传统的基于继承的解决方案。 很难将代码组织策略称为无效策略,因为它们通常会根据个人喜好而有所不同。 但是,我建议,最好的代码组织形式是允许读者准确地推理代码,同时最小化遍历代码库的距离。 延迟关闭 让我们看一下另一种常见的Swift设计模式,该模式专注于改进局部推理。 一种常见的做法是在UIViewController子类的viewDidLoad函数中执行设置工作。 就像前面的按钮示例一样,这很好用。 注意,我们在存储的属性声明和覆盖的函数之间划分。 这是我们要重点关注的问题-查找与视图相关的所有代码通常需要搜索。 相反,我们可以使用闭包来初始化视图。 闭包被标记为lazy因此可以在闭包内访问self 。 这允许属性引用在self声明的任何常量,并为任何控件设置目标操作。 此策略也适用于情节提要板。 代替使用闭包,可以使用didSet属性观察器,当故事板设置出口时会调用该属性观察器。 这对于无法在情节提要中设置的视图属性(例如拐角半径,渐变等)特别有用。它会将我们的更改本地化为视图本身。 无需将代码散布到整个文件中,我们可以将其放在一个位置。 协议一致性扩展 协议在整个Swift标准库和Cocoa Touch API中都使用。 它们提供了编译时的保证,即对象具有某些属性或功能。 这是另一个常见的模式,在视图控制器中实现集合视图的委托和数据源。 再一次,这有效。 但是,委托函数通常很长,并且往往会使实现它们的控制对象的大小膨胀。 很难说出某个属性或函数何时满足协议要求,以及它属于哪个协议。 […]

在iOS上构建自己的视频音序器时要避免的陷阱

Rosberry 的iOS开发人员Anton Kormakov 嗨! 我叫Anton,我是Rosberry的iOS开发人员。 不久前,我碰巧从事名为Hype Type的项目,不得不解决一些有关使用视频,文本和动画的有趣任务。 在本文中,我想告诉您一些陷阱,以及如何避免它们在iOS上构建实时视频定序器。 Hype Type使用户可以录制一组短片和/或多张图片,总运行时间为15秒,向制作的剪辑中添加文本,并向其中应用一个可用的动画。 在这种情况下,处理视频的关键方面是,用户应该可以选择彼此无关地管理视频剪辑:更改播放速度,反向,翻转和(可能在以后的版本中)随时随地交换剪辑。 您可以问:“为什么不使用AVMutableComposition ?” 在大多数情况下,您是对的-显然这是一个相对方便的视频音序器。 但是,遗憾的是,它有很多限制,所以我们无法使用它。 首先,不可能在旅途中更改和添加轨道-要获得更改后的视频流,必须重新创建AVPlayerItem并重新初始化AVPlayer 。 同样,使用AVMutableComposition中的图像并不是完美无缺的-将静态图像添加到时间线中,必须使用AVVideoCompositionCoreAnimationTool ,这肯定会增加大量开销,并且会大大降低渲染速度。 简短的网络搜索并未发现其他或多或少合适的解决方案来应对这一任务,因此我们决定开发自己的视频序列发生器。 首先,介绍一下项目中渲染管道的结构。 我必须立即说,我不会详细介绍希望您有所了解,否则这篇文章会引起骚动。 如果您是新手,我建议您应该更加注意著名的框架GPUImage (Obj-C,Swift),这是在OpenGLES上使用清晰插图进行处理的一个很好的起点。 负责通过计时器在屏幕上呈现录制的视频的视图( CADisplayLink )向定序器请求帧。 由于该应用主要用于视频,因此使用YCbCr色彩空间并将每个帧作为CVPixelBufferRef发送会更合乎逻辑。 在获取每个帧时,将创建亮度和色度纹理,并将其发送到着色器程序。 一个人在输出上获得RGB图像,并呈现给用户。 在这种情况下, 刷新循环如下所示: 这里几乎所有内容都是使用包装器构建的(用于CVPixelBufferRef , CVOpenGLESTexture等)—这允许将基本的底层逻辑带到单独的层,并大大简化了使用OpenGL的基本步骤。 当然,它有一些缺点(主要是-性能略有下降,灵活性较低),但是,它们并不是那么关键。 值得澄清:self.context —是EAGLContext的简单包装,使CVOpenGLESTextureCache和多线程OpenGL调用的工作更加轻松。 self.source —一个定序器,用于确定应从哪个轨道将哪个帧分配给视图。 现在有几句话关于我们如何组织要渲染的帧的获取。 由于定序器将同时处理视频和图像,因此用通用协议覆盖它是合乎逻辑的。 在这种情况下,音序器的任务是控制播放头,并根据其位置从相关音轨中释放新帧。 实现MovieSourceProtocol的对象处理如何获取帧的逻辑。 这种方案使该系统具有通用性和可扩展性,因为图像和视频处理的唯一区别将是获取帧的方法。 因此,我们的VideoSequencer变得非常简单,主要的问题仍然是识别当前轨道,并使所有轨道具有相同的帧频。 这里的VideoSequencerTrack是实现MovieSourceProtocol的对象的包装,该对象包含不同的元数据。 现在,让我们开始获取帧,并仔细观察一种情况-图像表示。 一个人可以从相机上获取它—在这种情况下,我们可以立即以YCbCr格式获取CVPixelBufferRef,然后仅复制它就足够了(为什么这很重要,我将在后面解释),并根据请求将其返回。 或从图片库中获取图片-在这种情况下,您将不得不跳过一些挂钩并将其手动转换为所需的格式。 从RGB转换为YCbCr可以在GPU中进行处理,但是,现代设备的CPU可以非常快地完成此任务,尤其要记住,应用程序在使用图像之前还会对其进行裁剪和压缩。 其余的很简单。 唯一要做的就是在给定的时间内给出相同的帧。 现在,让我们添加一些视频。 我们决定为其使用AVPlayer-主要是因为它具有易于使用的API来获取帧并处理声音。 […]

2018年最值得学习的10种编程语言

保持领先是业务和技术创新的关键因素之一。 拥有600多种独特的编程语言,为您的项目选择最佳的编程语言可能很困难,并且可能是初始开发阶段最困难的部分。 为了帮助您,以下是我们在2018年学习的十大潜在编程语言列表,以帮助确定用于项目的最佳编程语言是评估项目需求。 1. Swift :这是比Objective-C更流行的语言,它是开发本机iOS或Mac OS应用程序的语言,并且是重塑未来的最有可能的编程语言。 已经发现本机应用程序胜过跨平台混合应用程序,而SpriteKit使构建2D游戏变得更加容易。 确实,它以C和Objective-C的成功为基础,没有兼容性的限制。 它在很大程度上受Ruby和Python的影响,被认为是用户友好且易于使用的。 Swift是一种高级语言,通常易于维护,是Apple为iOS开发的通用多范式语言。 因此,如果与Apple产品合作是您的利基市场,那么这就是适合您的语言。 作为静态类型的语言,意味着Xcode会为您检查错误,因此您的错误更易于跟踪,而且,随着事物的定义更加明确,它的运行速度也更快。 Swift拥有领先的竞争优势,因为它还拥有自动引用计数(ARC),这是一项众所周知的功能,可以实时跟踪和管理应用程序的内存使用情况,以确保不会占用过多的内存。 使用这种语言可能会给您带来优势,因为iOS应用程序通常比Android应用程序更有利可图。 2. Ruby :1993年由Yukihiro Matz Matsumoto诞生的一种通用的,面向对象的编程语言。 它的需求量是Python的5倍,它是增长最快的编程语言之一,对于大多数已完成的项目,Java才可见。 实际上,Ruby非常易于使用,您可以在10分钟内在其中创建一个应用程序。 Groupon,Airbnb,Pxlr和Bloomberg都用Ruby编码,还有更多。 Ruby以动态的,面向对象的方式运行,因为它的读法类似于英语,因此使代码易于阅读。 需要维护许多高端网站的代码数据库,因此Ruby的需求不断增加,以至于在DevOps角色中变得很常见,即工程师确保运行高流量网站的服务器的可靠性和效率。 根据您公司的需求,这可能是您的理想之选。 3.由于WordPress, PHP被广泛使用。 在前1000万个网站中,有80%以某种方式使用PHP,包括Facebook和Wikipedia。 关于如何构建特征没有硬性规定,并且它具有解决问题的灵活性。 它以自由职业者的身份或流行的内容管理系统进一步得到广泛使用。 这是Web开发的绝佳选择,因为它主要是服务器端脚本语言,是WordPress和Facebook的基础。 因此,对于Web开发而言,学习PHP是成功的必备条件。 学习PHP使您能够创建令人惊叹的动态网站和Web应用程序。 您可以将PHP用于各种Web开发项目,包括电子商务,移动应用程序开发,内容管理系统。 它是一个开放源代码,易于学习,具有简单的数据库集成,并且具有许多应用程序和用途。 4. C ++ :它创建于1983年,是对C的替代,并有充分的理由立即受到欢迎。 它具有预定义的类,可以与程序员可能已经在使用的类一起使用。 Microsoft Windows和Google Chrome是使用C ++创建的两个最著名的项目,实际上,大多数Adobe和许多亚马逊网站都是用C ++编写的。 由于该编程语言是一种功能强大的工具,可适用于金融,银行,游戏,电信,电子银行,零售等多个领域,因此仍然需要这种编程语言。 确实,学习C ++使您能够轻松编写应用程序以及游戏和商业软件的代码。 它是目前最强大的语言之一,并具有多种功能,包括依赖于平台(即,该程序在与开发该程序相同的操作系统中执行)。 5. C :成立于1972年,使程序员能够在UNIX操作系统中进行编写,但事实证明它仍然非常非常受欢迎。 它是世界上使用最广泛的编程语言之一。 而且由于它以“机器级”语言运行,因此您将能够了解程序与硬件的交互方式。 […]