Tag: swift

使用Grand Central Dispatch进行并行计算和编程

我们将使用原生的Grand Central Dispatch( GCD )框架研究iOS上Swift的并发编程。 如果您不熟悉并发编程,建议您先看一下Wikipedia。 让我们开始研究此API背后的哲学和良好实践。 GCD (Grand Central Dispatch)是一个框架,提供低级API来处理iOS,macOS,tvOS和watchOS平台上的并发编程。 苹果公司提供竞争管理的所有更高级别的框架(例如NSOperation )都基于GCD 。 这些API允许您将流程的工作划分为各个任务,然后使用队列帮助协调并行或顺序执行这些任务。 它使我们能够从线程,处理器或核心的概念中抽象出来,并同时利用其自己的线程池来优化资源管理。 GCD所基于的基本概念是FIFO(先进先出)。 我们要执行的任务将首先插入到这些队列中,然后GCD将单独检索它们,以将它们分派到正确的线程/处理器/心脏。 我们可以区分两种文件: 并发文件:并行执行多个任务 顺序或串行 文件:连续执行一对一的任务 这是现有文件的3类: Main queue :等同于主要处理应用程序UI的主线程。 所有UI调用都必须在此队列上完成。 Global queue :系统为我们提供3个具有不同优先级(高,默认和低)的全局尾部。 这3个文件是Concurrent类型的。 Custom queue :可以手动创建并具有所需类型(串行或并发)的队列。 让我们从创建3个队列类别之一开始: 为了创建自定义队列 ,我们首先定义一个标识符(建议使用反向DNS格式)。 现在我们知道了如何创建文件,如何使用它们? 非常简单,这要感谢“调度员”! 这是一个小例子: 让我们分解所有这些。 我们开始创建低优先级队列。 然后,我们在先前恢复的低优先级队列上异步“分发”代码块。 该代码块异步获取数据以将其存储在data变量中。 最后,我们使用恢复的数据更新主线程中的view 。 在主线程中执行最后一步非常重要,因为UIKit不是线程安全的,并且如果您在另一个线程中更新组件,则应用程序可能崩溃或具有未定义的行为。 控制台将在此处显示: 之前 后 内部异步块 在主队列块内 完蛋了! 使用GCD您可以管理所有有关并发编程的问题。 在本节中,我们将进一步介绍不同的使用情况。 […]

如何在可编码协议中使用Swift 5结果

我已经写过有关Alamofire API管理器的文章,但是有了新的Swift 5 Result功能,我想对其进行一些升级。 我们将它与Codable协议一起使用,使我们的生活更加轻松。 如果您不是Alamofire粉丝,则可以将其删除。 但是,结合Codable和Result的原理,您应该尝试在网络处理程序中实现。 这个想法是建立一个可重用和直接的API管理器。 我们必须使用单一职责原则创建一些帮助程序类-ErrorObject,EndpointType,EndpointItem,NetworkEnvironment。 我现在不会解决这些问题,因为您在这里。 API管理器 我们的APIManager使用EndpointItem对象创建URL请求。 同样,它解析数据。 使用Codable时,解析是一项简单的任务。 因此,代表数据模型的所有结构和类都应实现Decodable和Encodable协议。 我们使用通用参数T,其中T是可编码的。 T通知APIManager我们正在获取哪种数据以及希望管理器返回哪种类型的对象。 T可以是实现“可解码”和“可编码”协议的任何对象或对象数组。 处理程序需要Result类型。 因此,Result的第一个参数是通用参数T,第二个是错误对象。 我们使用Swift.Result表示法,因为Alamofire也有其Result对象,并且我们需要指定要使用的对象。 APIManager —带有Swift 5结果的通用方法 收到响应后,APIManager尝试解码数据。 如果成功,他将退还。 在其他情况下,它将返回AlertMessage对象。 值得一提的是,Result对象的第二个参数必须符合Error协议。 我们需要扩展AlertMessage对象。 AlertMessage —错误对象 在APIDemoViewModel中,我们使用API​​Manager的方法。 在这里,我们指定要获取的结构,以便将数据解码为适当的对象。 APIDemoViewModel-实现的APIManager通用方法 好处 如果将APIManager与Results和没有结果进行比较,则主要优点是我们不再具有可选参数,并且可以使用强类型引用。 这意味着我们的代码更直接,更容易读写。 结果错误也很重要,因为它们是强类型的,我们可以创建自定义错误,使它们适合我们的项目。 只是不要忘记它需要符合Swift的Error类型。 现在我们确定我们将获得成功或失败,不可能两者皆有或两者皆有。 没有Swift 5结果的APIManager旧版本 结论 我们将Swift 5结果和Codable协议结合在一起,使我们的代码更清洁,更高效。 这是一个简单的代码示例。 如果您有任何问题或建议,请随时发表评论。 资源资源 示范项目 Alamofire Api Manager-原始帖子

raywenderlich.com的官方Swift样式指南

类前缀 Swift类型由包含它们的模块自动命名,并且您不应添加类前缀(例如RW)。 如果来自不同模块的两个名称冲突,则可以通过在类型名称前添加模块名称来消除歧义。 但是,仅在可能出现混淆的情况下指定模块名称,这种情况很少发生。 导入SomeModule 让myClass = MyModule.UsefulClass() 代表们 创建自定义委托方法时,未命名的第一个参数应该是委托源。 (UIKit包含许多示例。) 首选: func namePickerView(_ namePickerView:NamePickerView,didSelectName名称:字符串) func namePickerViewShouldReload(_ namePickerView:NamePickerView)->布尔 不推荐: func didSelectName(namePicker:NamePickerViewController,名称:字符串) func namePickerShouldReload()->布尔 使用类型推断上下文 使用编译器推断的上下文编写更简短的代码。 (另请参见类型推断。) 首选: 让选择器= #selector(viewDidLoad) view.backgroundColor = .red 让toView = context.view(forKey:.to) 让view = UIView(frame:.zero) 不推荐: 让选择器= #selector(ViewController.viewDidLoad) view.backgroundColor = UIColor.red 让toView = context.view(forKey:UITransitionContextViewKey.to) 让view = UIView(frame:CGRect.zero) 泛型 通用类型参数应为描述性的大写驼峰名称。 当类型名称没有有意义的关系或角色时,请使用传统的单个大写字母,例如T , U或V […]

适用于Swift开发人员的Python

我什至尝试了一下,但并没有太认真,但是这次我向自己保证,我将彻底探索该语言。 它把我吹走了! Python仅需几行代码即可为您提供强大的功能。 几行代码,您正在绘制一个UI,其中包含一个窗口和几个在OSX,Linux和Windows中运行的控件。 再加上几行代码,就可以像这样以2D渲染游戏。 Python语言 有人声称Python和Swift非常相似。 我会说它们是完全不同的,但是在某种程度上,Python在编写代码时似乎非常熟悉。 我发现的第一个区别是Python使用的数据类型是: 整数,浮点数,字符串,复数,布尔值,元组,列表,字典和集合。 除了复数(这是我看到的第一种语言,它本来就支持它,这似乎很奇怪,因为除科学家们以外,它们没有被广泛使用,尽管很酷),它们都是Swift程序员非常熟悉的数据类型因为我们使用了所有这些,尽管可能有些不同。 Python并不使用带有方括号{}的块,而是一种非常聪明的方式,使块位于缩进内部。 在Python中,缩进内置于解释器中。 属于代码块的代码必须缩进,否则会收到错误消息。 这是使Python特别可读的功能之一。 Python非常直观,使用诸如PyCharm Community Edition之类的IDE可以非常轻松地调试代码并了解程序中正在发生的事情。 徽标作家回来了! 在1980年代,我还是一个孩子的第一步就是使用Logo Writer完成计算机和编程方面的工作,在学校里用乐高积木和所有这些东西建造机器人。 这一切对我来说似乎都是神奇而令人兴奋的,我每天都会去实验室尝试学习新事物。 我不得不承认,当我发现Python拥有一个名为Turtle的超棒库时,我有点感动,该库基本上模仿了我成长时用来绘制的Logo Writer turtle。 类和对象 作为现代语言,Python是一种具有面向对象编程能力的语言,并允许其用户创建类和对象。 输出 : – [Johhny,41] – 他们是一样的 在Python中,您可以像在Swift中一样创建对象。 它们有一个构造函数(在某种程度上类似于第4和第5行中描述的Swift构造函数)。 在python中,您不必声明对象的成员变量(只需像第4行那样访问它们,它们就会自动创建,即self.name =’mortimer’ 在Swift中,您可以覆盖运算符! 耶! 您可以覆盖==,+,,*,无论您想要哪个! 在此示例中,我重写了等于运算符 就像我们在Objective-C和Swift中所做的那样,您可以声明一个描述符方法,并输出一个友好的类描述,您可以在Python中执行相同的操作: var description: String { return “-[” + self.name + .. + “]-“} 在第15行中,我编写了一个简单的描述符,用于调试Person类,该描述符实际上在第18行中使用。 […]

iOS中的资源包和静态库

如何在静态库中使用图像,Xib和情节提要之类的资源。 默认情况下,这在动态库中很容易实现,但是当涉及静态库时,可能会遇到一些挑战。 在本文中,我希望解释如何在静态库中使用故事板和图像之类的资源。 让我们跳进去。 步骤1:创建静态库 导航到“文件”->“新建”->“项目”,然后选择“ Cocoa Touch静态库”。 让我们给静态库起个名字。 那很简单! 步骤2:设定资源套件 导航到您的库项目,然后选择“添加目标”。 然后导航到macOS并选择Bundle。 命名资源束,我将其命名为Resources🙃 由于我们正在为iOS开发,因此将您的资源包基础SDK设置更改为“最新的iOS…”。 最后,将资源作为目标依赖项添加到您的静态库中。 步骤3:设定资源 在静态库中使用所有适当的配置和链接设置一个简单的ViewController和Storyboard。 为了使Storyboard成为捆绑软件的资源,您要做的就是将它们添加到目标的“复制捆绑软件资源”构建阶段。 现在您的静态库已准备就绪。 步骤4:链接静态库和资源包 通过创建一个简单的单视图应用程序并在viewDidLoad上模态显示“ MyViewController:”,来使用我们的新静态库。 为此,您必须将静态库.xcodeproj拖放到基本应用程序中。 这可能看起来像这样。 然后,您可以通过“链接的框架和库”链接静态库,就像这样。 最后,添加将资源束从静态库链接到基本应用程序。 为此,我们只需要将其从导航器窗格拖到应用程序项目的“ Copy Bundle Resources”阶段即可。 这应该看起来像这样。 第5步:使用它吧! 🎉 将以下代码添加到基本应用程序的视图控制器中,以便可以从适当的资源包中加载Storyboard。 一旦捆绑包被加载,您就可以简单地实例化并呈现它。 小菜一碟吧! 图像呢? 是的,您可以将图像引入静态库,但是必须将图像资产添加到资源包中,然后通过Xib,Storyboard或Bundle加载它。 希望您发现本教程对您有所帮助。 如果您有任何问题,请给我ping通,我很想听听您关于在静态库中使用资源包的想法。 和平✌️

使用LLDB在Xcode中进行调试

数据冒险 犯了错误 有时,我们会对不正确的事情做出假设。 这种说法似乎很明显,这是人的天性。 编写软件时,最好质疑您的假设是否正确。 很多时候,您会发现,仔细检查后发现事情与最初出现的情况并不完全相同。 🤔挑战你的假设 使用Xcode时,可以质疑我们的假设的一种方法是使用调试器。 调试器是一种工具,可让您使用细粒度的控件检查和操纵代码执行。 通过调试,您可以更好地了解您的代码在做什么。 这篇文章旨在简要概述Xcode中的调试以及一些可以帮助您的工具。 我打算就调试主题撰写一系列文章,这是第一篇。 调试的主题非常广泛,本文并不旨在提供完整的概述。 如果您觉得缺少什么,请继续关注本系列的更多帖子。 另外,请随时给我评论。 崩溃的土地之旅 这听起来可能有些奇怪,但是可以将代码崩溃视为旅途。 当您点击运行时,它开始运行并编译。 在此过程中,它继续使用方法并具有许多特性。 最终,它成功地找到了坠机土地。 当您开始调试时,您只有一小幅图片。 您有起点和终点,但要知道如何到达那里,就需要追溯旅程的步骤。 为了帮助您完成旅程,Apple向您赠送了一个有价值的物品LLDB调试器。 控制台和LLDB LLDB是Apple提供的软件调试器,它是Xcode中的标准调试工具。 LLDB是一个功能强大的工具,可将应用程序分解为各个组件。 它的用途不仅限于Xcode IDE,即使您无法访问其源代码,也可以使用LLDB分解并检查应用程序。 鉴于功能和用途的广泛性,本文的含义更像是粗略的概述,我不想通过详细研究这些内容而超出范围。 调用堆栈 使用LLDB,我们能够检查调用堆栈以及堆栈中的特定堆栈帧 。 调用堆栈是由应用程序创建的数据结构,用于跟踪其所有行为。 数据结构 堆栈数据结构只是一个队列,在队列中添加的最后一个元素是从中返回的第一个元素(LIFO队列-先进先出)。这与物理世界中的情况大同小异:一堆砖的顶部(如果您从底部取出,即添加的第一块砖,它们都将崩溃。) 堆叠框架 在调用堆栈中有称为堆栈帧的结构。 堆栈框架包含有关为其创建执行的信息。 在调试时,许多此类信息可能会变得有用。 数据范围从局部变量到完成时返回的内存地址。 苹果文档: 程序运行时,它将有关正在执行的操作的信息存储在称为调用栈的数据结构中。 每次调用方法时,程序都会在调用堆栈的顶部推入一个新的堆栈框架 ,其中包含以下内容:传递给该方法的参数(如果有),该方法的局部变量(如果有的话)以及指向该地址的地址。方法调用完成后返回。 断点 如果您不熟悉代码断点,请允许我给您简要介绍一下。 在Xcode中,断点使您可以在特定点中断代码的执行。 这很有用,因为它使您可以在给定的时刻详细检查应用程序的状态。 断点类型 象征绕道 在进一步进入断点之前,让我们先谈谈符号化。 符号化是将内存地址映射到更简单的函数名称。 返回我们以前计划的编程 处理断点时,重要的是要了解有不止一种类型。 让我们简要地谈谈一些重要的类型: […]

流行的Swift iOS图表库

大多数iOS开发人员正在学习中,或者现在正在Swift中进行全面开发。 我想快速汇总一下令人难以置信的code.com上三个评分最高的Swift iOS图表库。 这些是根据受欢迎程度,各种图表和功能选择的。 图表 流行的且恰当命名的Charts是一个很好的起点。 使用iOS,tvOS和OSX的Swift编写。 但是,值得注意的是该演示项目位于目标C中。 该库为我们提供了8种不同的图表类型: 线,条,组合,饼图,散点图,烛台,气泡和雷达 还有很多选择,例如 在两个轴上缩放(触摸手势,单独轴或捏缩放)。 使用触摸手势和组合图(线,条,散点图,烛台,气泡)进行拖动/平移。 可自定义的轴(x轴和y轴)和突出显示值(具有可自定义的弹出视图)。 将图表保存到相机胶卷并导出到PNG / JPEG。 图例是自动生成的,但也可以自定义。 2.汇票 这是适用于iOS的高度可定制的图表库,包括: 条形(普通,堆叠,分组,水平,垂直) 散点图,直线(直线/三次/自定义路径生成器) 面积,气泡,多轴。 蜡烛。 一切都是可自定义的,例如颜色,视图,单位,标签,动画,交互,轴等。 使用叠加层,信息视图等,可以轻松创建任意标记。 它使用模块化架构,应该可以轻松创建新的图表类型或添加效果。 3. PNChart-Swift-这是原始PNChart目标C库的快速版本。 它具有一些不错的动画并支持: 酒吧 线 雷达 馅饼 散点图。 如果您对此列表有任何补充,请联系我们,让我们知道。

使用Vapor Server Side Swift框架存根XCUITests

最初在XCBlog上发布在这里 毫无疑问,Swift是用于为iOS,macOS,watchOS和tvOS等Apple平台开发本机应用程序的出色语言。 但是,作为一种新语言,Swift缺少许多测试功能,就像我们在其他编程语言(如Ruby)中看到的那样。 在Swift中使用协议模拟类非常困难,并且存根网络请求的选项非常有限。 模拟是脆弱而艰苦的,到Swift时模拟变得更加困难。 Swift中没有可用的成熟模拟库来生成类似Java,Ruby,Python或其他语言的模拟。 开发人员必须手动编写所有模拟,并将测试代码与生产代码紧密耦合。 这里有一篇很棒的关于iOS网络测试的文章,以了解有关如何使用协议进行模拟的更多信息。 存根是测试代码的另一种方式,而不必依赖后端或网络。 使用存根,我们仍然可以实现网络测试的目标,并且不必将测试代码与生产代码紧密耦合。 我们将看到可用于存根的库的详细信息。 一些最受欢迎的库是用于XCTest(unit)测试的OHHTTPStubs,Mockingjay,Hippolyte。 用户界面测试贯穿网络层,涵盖了网络测试的所有方面。 苹果有XCUITest框架来涵盖Xcode UI测试。 我们可以使用一些库来为UITest存根网络。 一些流行的库包括Swifter,SBTUITestTunel和XCUITest(UITest)的Embassy。 但是,市场上出现了新的服务器端Swift框架,例如Vapor,Kitura,Perfect,它们也可以用于暂存网络请求。 在这篇文章中,我们将看到如何使用Vapor服务器端swift框架对网络请求进行存根。 Apple在WWDC 2015上宣布了Xcode的UI测试支持。UI测试被设计为完全黑盒,无需访问主应用程序代码和数据。 XCUITest使用两个独立的进程Test Runner和Target应用程序,测试运行器启动了目标应用程序,并使用UIKit内置的可访问性功能与在单独进程中运行的应用程序进行交互。 在嘲笑或测试UITest时,我们几乎没有选择 模拟和通过发射参数/环境 这意味着您不能直接模拟API。 与代理应用程序通信的唯一方法是传递启动参数或启动环境。 我们可以传递模拟API并创建启动环境变量,然后将其传递给XCUITests,但这需要大量的工作。 代码用if-else语句括起来,以确定听起来不太好的构建配置。 Web服务器存根后端并返回响应 剩下的其他选择是对网络呼叫进行存根并从服务器获取所需的数据。 为此,我们需要模拟后端并指向我们的应用程序以使用这些端点。 问题是我们是否仍可以使用上面提到的存根服务进行单元测试。 我们仍然可以使用这些库来处理网络请求,但是有时它需要更改主应用程序的逻辑,并且需要重构某些东西以增加额外的工作。 我们需要在生产代码中添加很多测试代码。 在我先前关于XCUITest的网络存根选项的文章中,我们介绍了所有选项,例如Swifter,SBTUITestTunel和Embassy for XCUITest。 现在,让我们详细介绍一下Vapor。 服务器端Swift框架尚未投入生产,但我们可以将其用于存根XCUITest的目的。 我还没有在互联网上读过任何人做的书,但是它工作得很好。 市场上几乎没有可用的Server Side Swift框架,例如Perfect,Kitura,Zewo和Vapor,但在此演示中,我们将使用Vapor。 选择蒸气的原因是它很容易学习,并且蒸气周围的社区正在迅速发展。 它完全由Swift编写,并带有易于上手的Vapor工具箱。 为了演示此功能,我创建了一个演示应用程序,当我们在文本字段中输入Github用户名时,它将显示Github用户信息。 您可以从Github Vapor-XCTest克隆该应用程序,该应用程序具有带有和不带有存根的XCUITests。 您需要安装Xcode 9+和OpenSSL,然后我们才能签出演示应用程序。 $ git clone https://github.com/Shashikant86/Vapor-XCTest […]

Pola Arsitektur MVVM pada迅捷

您尝试过MVVM吗? 嗨,😁! Pastikan Anda Sudah Paham Mengenai TableViewController , Extension和 关闭回调 西伯利亚甜菜 苹果merekomendasikan Pola Arsitektur MVC(模型-视图-控制器) 开发者 dalam iOS / MacOS 开发。 Namun dengan adanya ViewController pada Swift,banyak aplikasi yang dibuat menjadi seperti: Dengan ViewController是MVC(Massive View Controller)。 月经MVVM Dengan menggunakan MVVM,维护部门维护Sebuah aplikasi dapat dibangun secara lebih rapi dan mudah untuk di maintenance。 MVVM(Model-View-ViewModel)记录数据和数据数据ViewController和ViewModel。 Dimana ViewController […]

可编码协议

从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”) […]