Tag: swift

在Swift中了解委派

Swift是最令人困惑的主题之一。 在本文中,您将从使用原因开始,并以示例说明如何实现在对象之间传递数据的示例来完全理解委托。 我们将通过六个简单的步骤探索授权。 当发生特定操作时,“ 委托” 是一种设计模式,允许将数据从一个对象传递到另一个对象 我们为什么使用委派? 每当我们试图将数据从一个对象传递到另一个对象时! 在本文中,我们将练习在TouchableView和ViewController之间使用委托和协议来传递数据。 单击蓝色圆圈时,在输出中将显示消息“这是来自委托人的消息”。 首先,请先下载该入门项目! 打开TouchableView.swift并找到第一步。 首先创建一个协议并将其命名为tapDelegate 。 该协议可以具有多种功能。 对于这种情况,我们将创建一个名为tappedButton的函数。 协议是一个蓝图 。 该蓝图列出了所有必需的要求,例如方法和属性 。 在第一步中,该协议被类采用。 该类为我们提供了一种实现协议内部创建的功能的方法。 出于可读性考虑,使用“代理”一词来命名该协议是一个好习惯。 让我们创建一个委托属性并将“类型”设置为协议。 确保在前面添加关键字weak ,并将类型设置为带问号的可选。 弱关键字用于避免保留周期和可能的内存泄漏。 一半! 我们想让ViewController知道 每当按下蓝色圆圈时。 为了建立连接,我们需要将在步骤1中在协议中创建的委托方法调用添加到handleTap函数。 ViewController从哪里获取数据? 从我们在TouchableView中创建的代表! 为了实现此目的的连接,我们将tapDelegate应用于ViewController 。 当协议被采用时,要求ViewController必须使用蓝图中列出的方法或属性。 为了符合协议,我们将创建蓝图中列出的功能,并在按下蓝色按钮时键入一条消息。 最后,我们将委托分配给self。 你为什么要问自己? Self引用类ViewController 。 由于ViewController是要委派的那个,因此我们将委托从touchableView设置为ViewController (自身)。 恭喜! 继续运行模拟器。 按下蓝色按钮,您应该会看到一条消息。 如果您没有在底部看到调试器区域,请按Xcode中的Command + Shift +Y 。 你会看到这个⬇️

功能视图

视图是iOS应用程序的基础构建块。 随着您获得更多的经验或开始从事复杂的项目,编写视图的方式将会发展,并且您将开始更加关注设计模式,可测试性和一致性。 有很多方法可以尝试! 我们在iZettle的经验使我们找到了一种有趣的实用方式来思考我们想分享的观点。 假设我们有一个视图层次结构,可以在几个地方重用。 它由一个标签和一个文本字段组成,它们看起来像这样: 我们通常将如何组织与它们相关的代码? 从熟悉的方法开始 实现此层次结构的一种流行方法是创建UIView的子类,该子类将知道如何呈现其子视图。 我们将其称为PriceView 。 如您在图像中所见,在这种情况下,两个子视图很简单,因此不需要任何特殊的渲染代码。 我们将实例化它们,将它们添加为子视图,并指定样式和布局规则。 像这样: 传递输入数据 我们的PriceView有一些输入和输出。 让我们讨论它如何接收金额更新和描述占位符。 在上例中,子视图被公开为公共属性。 这样, PriceView不会封装其实现细节,无论显示在哪里,我们都将紧密耦合。 例如,如果文本字段需要替换为文本视图,则我们将不得不在多个位置更改代码。 我们可以做得更好! 我们可以将子视图设置为私有属性,并仅公开采用输入的配置方法并将其内部传递给子视图。 这意味着在我们的实现中,我们将在一个地方创建子视图,并在另一个地方设置它们的状态。 现在让我们尝试一种更被动的方式来处理输入数据。 我们可以通过初始化程序传递所有数据源。 对于应该在外部进行更改的事情,我们可以传递一个可观察的类型。 在不同的反应式框架中对此有很多看法-在我们的示例中,我们将使用iZettle的Flow框架及其ReadSignal类型。 对于不变的东西,例如占位符文本,我们只需传递值即可。 这种方法使我们可以在一处创建子视图,对其进行订阅并对所有可观察对象做出反应。 处理用户输入 触摸事件和其他用户交互如何? 我们可以使用熟悉的委托模式 -在PriceView中配置一个可以处理事件的对象。 如果我们希望有一个对象对PriceView的输出做出反应,但不缩放到多个对象,则此方法效果很好。 另外,对于广播到多个对象,我们可以使用通知和观察模式 。 但是,实施观察者管理可能是一项繁琐的任务[1]。 与输入一样,我们也可以在此处使用反应模式 。 如果PriceView公开了一个可观察的类型,我们可以通过它广播事件,而不必关心有多少对象观察到它-零个,一个或多个。 Flow的信号类型也可以在这里为我们提供帮助。 放在一起 因此,我们已经看到将信号用于输入和输出具有一些好处,并且可以将它们放在一起。 在这一点上,我们可以质疑为什么我们应该首先继承UIView ,因为我们没有绘制任何复杂的东西。 我们可以通过将输入移至结构的属性,并将视图创建移至返回简单UIView和输出信号的函数来进行清理。 酷吧? 注意:我们将PriceView的名称更改为PriceDescriptionEntry ,因为它更清楚地表达了我们想要表示的意图。 PriceDescriptionEntry现在是一个定义,可以多次传递和实例 化以创建视图。 我们如何使用这个 iZettle的应用程序已经发展了八年,并且代码库和团队正在迅速增长。 为了保持一致,我们倾向于将类似的解决方案应用于相似的问题。 […]

Xcode Server:iOS持续交付的XCS的十大限制

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客 。 在苹果公司宣布Xcode 9内置Xcode Sever(又名XCS)之后,我写了一篇详细的文章,介绍如何设置Xcode Server以实现iOS与Xcode 9的持续集成。 该帖子提到了一些关键功能,包括内置服务器,无头和并行测试,自动代码签名和设备置备。 该帖子最初发布在我的个人博客上,并重新发布在Medium和DZone上。 但是,不久之后,我开始收到有关Xcode Server的局限性的评论,以实现iOS应用程序的持续交付。 使用Xcode Server for CI时,我也遇到了一些问题。 其中有些是已知的,有些是未知的。 我认为在这篇文章中值得分享,我们将讨论Xcode Server的主要限制。 这里列出了与Xcode Server相关的各种问题,但我们将介绍Xcode 9和Xcode Server的前10个问题。 请注意,下面提到的所有这些问题都是在撰写本文时。 目前,尚无法测试Github拉取请求。 一旦创建了Pull请求,许多TravisCI之类的CI服务器就可以构建iOS项目,以便开发人员可以及早获得反馈。 但是,对于Xcode Server,目前尚无法实现。 我印象深刻的是,Xcode Server不仅是为Github构建的,而且还发现了Xcode 9与Github紧密集成的事实。 苹果也应该考虑这个问题。 这是Xcode Server中严重错过的功能。 没有该功能,该产品将不完整。 以前,有一些工具可提供解决方法。 诸如Buildasaur或XBot Builder之类的工具可用于监视GitHub存储库中的拉取请求。 一旦创建请求请求,这些工具就会用于创建Xcode Bot并使用结果更新GitHub。 但是,情况发生了很大变化。 这些工具不再与最新版本的Xcode Server一起使用。 另一个解决方法是创建一个GitHub Webhook来监视请求请求,使用Xcode Server API创建Xcode […]

象老板一样的可观察者— RxSwift简介

现在该开始您的反应式编程之旅了! 您的生活将不再相同。 这是将要发生的事情:我将尝试以可能最有趣,最简单,最令人难忘的方式来解释RxSwift(我已经研究了大约6个月)中的概念。 许多人告诉我他们已经开始学习Rx,但是却找不到继续的时间或精力。 我们开工吧。 你是一条狗。 您的主人可能会或可能不会有食物。 如果他们确实有食物,正在考虑食物,甚至看过食物,那么您想知道! 您想立即知道,以便做出最佳舞蹈动作并打扮迪斯科风格,以便可以吃饭。 这是你的生活,这是你的使命。 使用可观察对象非常像这样。 事情可能会或可能不会发生,当事情发生时,它们可能会有价值,也可能不会。 无论哪种方式,它们都为我们提供了一个可以处理几乎所有类型的类,我们可以对此做出反应。 通常在iOS中,我们将创建一个数据模型,将其放置在某个地方并设置我们的视图。 问题在于,我们希望有机会在数据发生变化时做出响应:某人只是喜欢一个帖子,您的爱犬朋友刚刚发现了一根骨头,或者您可以感觉到自己最大的克星并需要告诉世界:猫。 我们可以通过传统方式实现:我们可以拥有一个委托(可以响应特定事件并处理它们的东西),可以使用通知中心或使用回调。 通过Rx,我们将使用可观察的东西! 在本教程中,我们将以它们的基本形式查看它们,将它们弄乱一些,然后讨论如何使其变得更好。 我们的第一观察 让我们创建一个单视图应用程序,并使用Cocoapods或Carthage将RxSwift导入到我们的项目中。 导入RxSwift 想象一下,我们想制作一个翻译应用程序,该应用程序可以说狗叫(最先进,最精致的交流形式)并将其翻译为他们会理解的奇怪的人类声音。 通常,我们只需要创建一个String变量,但是使用Rx时,我们要处理的是Observable,它们实际上是随时间变化的值。 时间很重要,因为我们不知道什么地方或什么时间会改变: 让dogToSpeechTest = Observable .just(“ Woof”) 在这里,我们使用具有”语法的泛型,指定要处理的类型。 我们使用方便的’.just()’方法为可观察对象提供初始值。 我们可能还想向我们理解缓慢的所有者发送一系列消息: 让dogToSpeakArray = Observable 。from([[“ Get”,“ me”,“ food”]) 我们使用’.from()’运算符从数组创建事件序列。 关键是,我们实际上可以做什么? 好吧,我们可以订阅它们。 我们会讲出每个单词并在说出来时进行翻译,并更新用户界面! 观察值使我们可以访问以下内容: – onNext –下一个值已到达,已更改,这里是最新值–就像通知 – onError –出现问题了,您有机会对错误做出回应 – onCompleted-此任务已完成 – onDisposed –我们不再需要对此可观察的订阅,因为它不需要 […]

如何:在Swift中映射,缩小和过滤

由Reinder de Vries撰写于2017年5月3日在App Development中 Swift的编程功能Map,Reduce和Filter可能难以挑战。 特别是,如果您总是编写for循环来解决迭代问题! Map,Reduce和Filter函数来自函数编程领域。 在Swift中,您可以使用Map,Reduce和Filter遍历诸如Array和Dictionary集合类型,而无需使用for循环。 在构建应用程序时,通常使用过程式或面向对象的编程方式。 函数式编程是不同的:它仅处理函数。 没有变量,没有“状态”,没有for循环-只是函数。 Swift编程语言非常适合于函数式编程。 但是,您无需严格地编写功能代码,只需采用功能编程中的概念(例如Map,Reduce和Filter)即可帮助您学习如何更好地编写代码。 Map,Reduce和Filter通常被称为高阶函数 ,因为这些函数将一个函数(一个闭包)作为输入,而将返回函数作为输出。 严格来说,Swift将在使用高阶函数时返回操作(即映射数组)的结果,而“纯”函数语言将返回函数的集合。 如果您在想:“伙计,我不需要功能编程或数据处理,因为我的应用程序不需要这样做!” —不要在这里停下来。 在最近的应用程序项目中,我多次使用过Map,Reduce和Filter: 过滤成本/收入值,使其达到一定阈值,然后再将其包含在折线图中 将成千上万的电影评分降低为一个平均评分 在此Photo App模板中的标签上映射一些操作(小写,删除“#”) 您当然可以通过for循环解决所有这些问题,但是您会发现使用map,reduce和filter函数可以使代码更简洁,可读性和性能更高。 在本指南中,您将学习如何使用地图,缩小和过滤功能。 您将对集合类型 (如Array执行这些功能。 以下是简要概述: map函数遍历集合中的每个项目,并对集合中的每个元素执行操作 reduce函数循环遍历集合中的每个项目,并将它们组合为一个值 filter函数遍历集合中的每个项目,并返回仅包含满足包含条件的项目的集合 换句话说: map功能将功能应用于集合中的每个项目。 考虑将一组值“映射”到另一组值。 reduce函数将一个集合变成一个值。 可以认为它实际上是将多个值减少为一个值。 filter函数仅返回通过if -statement条件且仅当该条件导致true的值的数组。 有趣的事实: MapReduce是基本的大数据处理概念,其中对集合并行执行密集操作。 一个示例是将一本书的页面概括为一个单词(映射),然后将这些单词存储在字母框中(减少)。 跳至相关章节: 使用地图功能 使用减少功能 使用过滤功能 链接图,缩小和过滤 结论 准备? 我们走吧! 成为专业的iOS开发人员 开始使用iOS 12和Swift 4 注册我们的iOS开发课程“ 零到App […]

了解Swift中的类型擦除

免责声明:本文的代码摘自 Mattt的 一本令人称奇的书, 名为《 Flight School Guide to Swift》 。 为了理解类型擦除,让我们看一个简单的例子。 假设我们有要解码的JSON。 JSON如下所示: { “ foo”:“你好”, “栏”:123 } 上面的JSON没有具体的类,因为我们不知道JSON将包含多少个键值对。 在Swift 4.0中,我们可以尝试使用JSONDecoder类,如下所示:

使用iOS应用内购买

与设置和测试应用内购买相比,iOS开发中要做的事情更多。 该过程很费力,需要进行全面的测试,尤其是从业务角度来说,应用内购买至关重要。 iTunes Connect配置-第1部分 本教程基于自动续订订阅,但是您可以通过非常相似的方式配置其他任何应用内购买。 要设置应用内购买,请按照以下步骤操作: 登录到iTunes Connect。 打开我的应用程序,然后选择要配置的应用程序。 打开“ 功能”标题,然后在左侧窗格中选择“ 应用内购买 ”。 点击+图标,然后选择应用内购买类型。 您可以使用4种类型的应用程序内购买: 每种类型都有特定的用例,因此请确保您先阅读说明。 如果看不到自动续订,则说明您尚未接受更新的Apple Developer Program License Agreement或者尚未在iTunes Connect上填写协议,税收和银行信息。 5.假设您选择了“自动续订” ,请提供“ 参考名称”和“ 产品ID” 。 a)参考名称仅在iTunes Connect和“销售和趋势”报告中使用。 它不会在App Store中显示,因此可以是您喜欢的任何东西。 b)产品ID必须是唯一的,因此建议您使用带有订阅名称的应用反向域名,例如: com.reversed.domain.onemonth 。 6.选择“ 创建新的订阅组”,或者选择一个现有的组(如果有)。 所有自动续订的订阅必须是组的一部分。 用户一次只能订阅一个组中的一个订阅,但可以更改为同一组中的另一个订阅。 这允许用户升级或降级订阅,而无需为同一服务付费两次。 与参考名称相同的订阅组参考名称仅在iTunes Connect和“销售和趋势”报告中使用。 7.应该会出现自动更新的订阅详细信息页面。 选择订阅期限 (从1周到1年)和可选的免费试用期(从3天到1年)。 8.单击“ 设置起始价格”以选择默认货币和价格(必须从定价层中选择),其他国家的价格将自动计算。 9.现在,您可以为各个地区选择不同的价格。 保存更改后,您会发现价格保留为定价层: 10.添加至少一个本地化版本,包括“ 订阅显示名称”和“ 描述” ,最好是支持的所有语言。 这些值将对用户可见,因此请确保它们听起来值得信赖。 11.现在,您需要向订阅组添加至少一个本地化 。 […]

Swift 4 ~~高阶函数-过滤,映射,归约和排序

您可能已经听说过Swift中的高阶函数 。 简单来说,高阶函数是开发人员友好的代码段,可在几行内完成复杂的计算。 很快我们有了Filter() , Map() , Reduce()和Sorted() HOF。 所有这些都有其自身的优点,并且在我们的代码中易于使用。 让我通过Swift4中的一些有趣的示例向您展示如何使用它们。 1.过滤器(_ 🙂 Filter方法将检查条件,如果条件满足,它将返回一个对象。 您可以将filter(_ 🙂与String,Array,Dictionary,Set等一起使用。 让我们在Set上看看如何使用它。 我有一组名称,我需要选择只有5个字符的名称。 那我该怎么办呢? //名称集 let nameSet:Set = [“ trivan”,“ mary”,“ larns”,“ tria”] //结果集 var resultSet:Set = [] //遍历nameSet中的每个元素 nameSet.forEach {(元素)在 如果element.count == 5 { resultSet.insert(element) } } print(resultSet) 如何使用HOF 过滤器(_ 🙂完成此操作? 让我用过滤器(_ 🙂向您展示上述要求的代码 let nameSet:Set = [“ trivan”,“ mary”,“ […]

斯威夫特:你好,世界!

两周前在PC home 24h看到特价新品iphone 6S +,忽然感知一股莫名的力量,回过神来已经买下去了…这是我第一次使用Apple的行动装置,用下去发现不得了!为什么会那么顺! 没错,就是这么简单的原因再度燃起了我对iOS App的学习心理! 那为什么说「再,度」? 因为这不是我第一次有学习Swift的念头。 大概一个月前,我看到了介绍文章: Hahow:iOS入门课程心得 少数同时包含介面设计和程式开发的课程,大约10小时。 pala.tw 详细的心得,让我初次对iPhone应用程序产生兴趣,就跟着他刷了iOS入门-从介面设计到开发 !花了大概十天的下班时间加上假日,断断续续的看完,也照着课程范例生出了简单的PO照片+贴留言的APP。 但是,对我来说最有收获的部分,不是在后段的程序教学,反而是前半段的设计的概念 , 流程以及Sketch设计软体的使用上。 由于工作性质的关系,敝公司是没有UI设计师的,PM设计的介面也都是功能导向,对于美感并不是那么的认识,所以这算是我初次接触设计的领域,也大概知道了设计UI会碰到的种种问题,以及Wireframe流程图的规划。 App程式的部分则是满好懂的…毕竟我姑且也是一名工程师,学完就只是有点股:“好像也还好。”的感觉,并没有很热切地想占用。 直到我手上拿到iphone的那一刻! 学习的欲望被挑起,当然就是要消消火,因此我上了常去的Udemy网站找找iOS的相关课程。 结果赫然发现,自己半年前已经买了!!!完全失忆… 我购买的是: Swift3从入门到精通– Udemy iPhone开发实战攻略 www.udemy.com 因此,虽然开始工作了以后已不如学生时期来的有空,但既然都买了,头洗了一半就要冲,就花点时间认真上完吧!! 不论学习哪种程式语言,十有八九会从「Hello,World」这个应用程式范例开始,学习Swift当然也要来跟程式Hello,Hello一下。 当然,只是打印出Hello World! 或者是让UI的TextField改变显示文字也是有点无趣,因此我Google了一下,依样画葫芦,制作了让画面的ImageView晃动的效果。 重点程式码如下: 为了让ImageView晃动,先建立了一个叫shakingAnimation的函数,它会回传CAKeyframeAnimation类别的对象,然后触发sayHelloButton按钮时,将这个物件塞入ImageView的layer里。 讲到这里其实我也似懂非懂,只是看得懂程序的逻辑,而又不熟悉Swift物件的细节以及写法,但我想,搞懂这些才是我学习Swift的目的! 在Medium上乱晃,意外发现还有人也在看一样的课程。 Swift3从入门到精通Day31:上架app到appleStore 日期:7/31(一) medium.com 不一样的是,他已经快看完所有的影片啦!让我瞬间觉得非常惭愧。然而,往好处想,也让我在学习的时候多了一个地方可以参考! 所以,只需这样做!虽然还要上班QQ。

深入研究RxSwift中的一次性机制。

嘿大家! 作为反应型恋人 ,我将继续撰写有关RxSwift的系列文章。 在我的第一篇反应性文章中,我讲解了flatMap函数的一些改进(您可以在此处进行检查),今天我想通过探索所有Rx Disposables来扩展RxSwift的知识。 本文将通过简短的解释和用法示例来探索Rx中可用的所有Disposables。 所以,让我们开始吧! 🚀 1. Disposable.Empty 每当您需要满足接口要求并且不需要进行任何资源管理时,此功能就很有用。 在幕后,它使用私有类-NopDisposable (Nop =无操作) Rosberry的Shaggy iOS工程师。 被动式开放源代码爱好者和保留周期检测器🙂 还要检查我有关编程,Twitter和开源项目的电报频道: