Tag: Swift编程

迅速。 功能可选。 第1部分

Optional是Swift中的基本类型。 尽管几乎无处不在,但大多数开发人员并未充分利用它,甚至没有以错误的方式使用它。 可选绑定反对DRY原理,并引入了不必要的条件。 在这个由多部分组成的系列文章中,我们将讨论Optional真正含义,如何正确使用它并应用一些高级知识,以便为Optional计算创建方便的功能性eDSL。 其他重要主题包括Swift中的依赖项注入策略,错误处理,隐式展开的Optionals和类型强制转换。 虽然不能总是避免使用最后两个,尤其是在与Objective-C代码交互时,但它们都是纯Swift的代码味道。 由于本系列的主要目的是理解功能概念以及如何在Swift中应用它们 ,因此我们将讨论和绘制而不是代码。 您会看到,还有很多工作要做。 第一部分从Optional 。 然后我们将讨论可选绑定 。 我们的旅程将把我们引向基本的功能概念: 纯功能 。 在那里,我们将停下来,探索更多内容,直到下一部分。 为什么可选? 在Objective-C中没有“ Optional这样的类型。 相反,如果函数或属性不返回值,则返回nil 空的 NSObject指针。 可以安全地将消息发送到nil并将其作为参数传递。 但是Swift没有像Objective-C这样的指针。 此外,如果任何类型可以为nil ,我们的程序如何保证类型安全? 如果我们传递nil字符串而不是数字,编译器如何弄清楚怎么办? 如果我们将nil传递给无法处理的函数怎么办? 为了处理此问题,引入了Optional 。 有什么可选的? 让我们看一下Optional声明: 枚举可选 { ///没有值 无案 ///值的存在 案例一些(包装) … } 因此,我们看到的第一件事告诉我们Optional是容器类型 :它封装了一个值。 图片 1.简单显示一个可选的Int值容器。 这里的黄色圆圈表示普通类型,而蓝色正方形表示“可选”容器。 您会看到, .none没有任何类型约束,因此使用诸如nil这样的文字很方便。 一个空盒子只是一个盒子,没有什么有趣的。 Optional还可以保护您避免将nil值传递给无法处理它们的函数。 这就是可选绑定起作用的地方。 可选绑定 可选绑定是用于访问包装到Optional的值的语句。 它看起来比声音更好,并且具有熟悉的语法。 如果您已经尝试过一些Swift,您将不会感到害怕 […]

Swift中用于像我这样的傻瓜的功能组合-第3部分

如您所见, Array每个值都由传递给map的函数转换。 我经常看到的一个错误是,认为 map 是用于集合的操作 。 它对于集合当然是有用的,但是将地图视为对集合进行操作的一种方式将您限制为集合类型。 在Swift中,Swift标准库中有一些针对Optional和Result类型的map函数,一旦您开始认识到它们在哪里有用,就可以为系统中定义的许多其他类型定义map 。 Optional和Result都不是集合,并且它们都是可map 。 两者还具有无法映射的状态。 当Optional为nil ,由于没有值,它无法将提供的转换函数应用到map函数,因此map跳过执行转换函数,而Optional值保持为nil 。 这种行为非常类似于Swift可选绑定的工作原理,但是没有所有样板。 首先,使用可选绑定而不是map的示例: 接下来,是一个使用Optional的map实现来完成相同任务的示例。 最后,一个使用“可选”的“ map”实现的示例显示,当“可选”为nil时,跳过了转换。 以类似的方式,新的Swift 5 Result类型中包装的值如果为.failure ,则无法进行转换,因此将跳过转换函数,并且一系列操作的结果将为.failure 。 这在组成一系列动作时非常有用,在这些动作中,您仅希望在前面的步骤成功后才执行该动作。 我将回到这一点,并在本文中进一步扩展。 以下是一些片段,展示了map如何在Result类型上工作: 所有这些的最终结果是,您可以将依赖于先前操作结果的操作链接在一起,而无需使用嵌套的ifs。 map函数将正确调用或跳过转换。 但是,这些示例中潜伏着一个问题。 如果Optional map中的转换函数产生另一个Optional ,则结果为Optional<Optional> ,即嵌套的Optional 。 完全有效,但很难处理。 在以下示例中查看有效内容的类型: 有一种避免这种嵌套的解决方案,在Swift(和其他(但不是全部)功能语言)中称为flatMap 。 Monad简介—认为可映射和可平面映射 和以前一样,请随时在线搜索Monad的完整定义。 范畴论的定义很难解析。 为了便于讨论,您需要知道的是Monad是包装类型,它具有flatMap函数和map函数。 flatMap函数将特定类型的转换函数(或态射)作为参数,并将该转换应用于包装的一个或多个值。 特定的转换是一种输入类型与包装类型相同且输出类型与Monad本身相同但包装一个转换值的转换。 换句话说,形状为(A) -> M ,其中M表示为FlatMapped的Monad类型。 换句话说, Optional上的flatMap期望形状为(A) -> Optional的转换函数, Result上的flatMap期望形状为(A) […]

在辅助项目中被旁听的好处。

史蒂夫·乔布斯(Steve Jobs)更著名的名言之一是“ 焦点是对数千个好主意说不 ”。 我发现大部分时间都是如此。 如果您的目标是生产产品或完成特定任务,那么将重点放在需要完成的事情上就很重要。 我相信大脑在解决问题时会找到模式和联系是很自然的,有时这些模式和联系可以使自己产生吸引人的想法。 当然,如果您沿着使自己可以使用的每条路径走下去,那么您将永远找不到想要去的地方。 但是,当涉及到附带项目时,我认为值得不时失去关注。 至少对我而言,辅助项目的重点是探索我发现的有趣事物,尝试新事物并扩展我的知识,超越我在工作中所做的事情。 因此,如果一个完全独立的想法来自于一个副项目,那么如果有意思,我会加入。 举例来说,我一直在学习Swift,并且一直渴望在应用程序上使用新发现的知识。 经过几个小时的研究,我决定使用Apple的SpriteKit和Swift构建游戏。 我已经弄清楚了高级设计和游戏机制。 我等不及要开始了。 该游戏原本将是单词搜索游戏,在搜索到单词时,网格会扩展。 我认为这是一种相当聪明的机制,它将使游戏变得更加有趣和动态。

Map vs Flatmap trong swift

–Các运算符chuyểnđổi数组​​trong swiftgồmcó:地图,平面图,归约。 Flatmapsẽfilterloạibỏnil let strs:[String?] = [“ a”,nil,“ b”,nil,“ c”] 令result = strs。 地图 {$ 0} print(result)// a nil b nil c let strs:[String?] = [“ a”,nil,“ b”,nil,“ c”] 令result = strs。 flatMap {$ 0} 打印(结果)// abc 让分数= [“ 1”,“ 2”,“三”,“ 4”] 让scoresInt =分数。 映射 {Int($ 0)} print(scoresInt)// 1 2无4 让分数= [“ 1”,“ 2”,“三”,“ 4”] […]

数据绑定的观察者模式的实现。

很多人可能听说过RxSwift —一种功能性反应式编程(FRP)框架。 它包含与处理数据流相关的大量功能,例如转换,过滤,将一个合并到另一个以及更多。 但是,如果您的项目不需要所有功能,而您只想对某些价值的变化做出反应,那么观察者模式就是您的首选解决方案! 今天,我将向您展示此模式的实现,它的应用以及作为奖励,如何以声明方式将可观察的值绑定到UI。 观察者模式有两个主要角色: Publisher-产生指示值已更改的事件的对象 观察者-对那些事件做出反应的对象。 首先,我们将专注于发布者类型,我们将其称为Variable 。 这将是带有通用参数E的类,该类指示观察值的类型。 我们来看一下Variable的接口。 它已指定将初始值设置为_value属性的初始化程序。 接下来,有两种主要方法: setValue(_:) —它将新值设置为_value属性,并通过使用新值调用所有观察者来通知类型(E) -> Void的所有观察者。 subscribe(_:) —将新的观察者添加到观察者数组中。 现在,我们可以使用Variable ,如下所示: 在这种情况下, Publisher是一个variable对象,而Observer是一个闭包,我们将其传递给subscribe(_:)方法。 现在,我们的发布者类型似乎很有用,但它缺乏非常重要的功能- 价值 转换 。 为此,我们将定义map(_:)方法。 顺便说一句,添加此方法将使Variable成为函子! 如果您对此概念感到好奇,请参阅Wiki。 这使我们可以进行如下操作: 控制台输出: Test Test-transformed 奖金部分 还记得我曾经说过的,您将可以将可观察的值绑定到UI吗? 干得好! 为此,我们将定义一个Bindable协议。 接下来,我们将添加一个自定义运算符 。 我们将其称为bind因为如果使用它可实现Bindable协议,我们会将Variable绑定到其他对象。 它只是bind(_:) Binder bind(_:)方法订阅到Variable 。 让我们使UILabel符合Bindable以启用绑定! 现在,变量绑定就像这样: 而已! 随时发表评论。 完整的源代码位于GitHub。您可以通过LinkedIn或Facebook与我联系。

迅速移动!

这有点哲学性,所以请忍受我。 我一直认为没有正确的时间去错! 但是我想我错了,显然错误的正确时机是当您知道自己是可以改变它的时候。 为了更加了解我的情况,我接受了迅速的采访,我几乎不了解函数式编程。 我想知道为什么它与Obj C有如此大的区别,但是当我偶然发现函数式编程时,我知道了原因! 我确信从C到C ++时,某些ppl有相同的经验(几十年前)。 用不同的范式思考就像是观念的转变。 就像那些拼图,您改变了视角,然后拼图看上去就完全不同了。 Swift是真正的现代编程语言。 因此,最好地理解它最好理解其设计中已包含的基本思想。 swift背后的基本思想之一是迈克尔·费瑟斯(Michael Feathers)的这则推特最恰当的描述,该推特谈到了函数式编程与面向对象编程 “ OO通过封装活动部件使代码易于理解,FP通过减少活动部件使代码易于理解。” Swift通过添加枚举和结构之类的值类型数据结构来减少活动部件,如果不能将一个对象简单地传递给一堆函数(将其变异),则更容易发现问题出在哪里,理论如下如果语言公开较少的潜在易错功能,则开发人员更不可能犯错误。 在初步了解之后,我回到了功能范式的基础,然后将重新学习更深入的知识,并计划在接下来的几周中记录自己的经验。 我希望这对于从Obj C到迅速发展的任何人都是有用的指南!

วิธีการติดตั้ง

netfox —一个轻量级的单行设置iOS / OSX网络调试库! 🦊 ทำiOSมาได้เกือบสองปีละแต่ก่อนเวลาจะดู请求,响应งใช้องใช้Charlesซึ่งต้องต่อWi-Fi,ยวกัน,ตั้ง代理,信任证书วุ่นวายพอสมควร CharlesCharlesี้นiOSแล้วนะให้สิทธิ์แก้ไขการตั้งค่าของเครื่องไม่ต้องตั้งค่าอะไรวุ่นวายแต่ต้องซื้อแยก ดีอดีinอtools toolsอ工具มาตัวนึงชื่อว่าnetfoxทางสว่างก็เกิดขึ้นเลยมาบอกต่อสามารถใช้ได้ทั้งiOSและmacOS applicationนะครับ ซึ่ง工具ตัวนี้ผมว่าดีในมุมของการ调试เองและลดงานระหว่างdevและtesterเช่นนtesterสามารถดูได้เลยว่า请求,响应ถูกต้องหรือไม่ก่อนที่จะมาหาiOS devและถูกไล่ให้ไปหาAPI dev (ฮา)และไม่ต้องเสียบสายดูLogcat(นั่นมันAndroidตะลึงตึงโป๊ะ) Giากตรงนี้ไปก็ข้ามไปดูในGithub https://github.com/kasketis/netfoxได้เลยหรือจะอ่านต่อก็ได้ 椰子纲 ใช้ายมากถ้าcoรใช้ cocoapods ลืมPodเข้าไปตัวนึงที่ Podfile ได้เลยอย่าลืม user_framworks! ด้วย use_frameworks! pod’netfox’ pod install าร pod install ให้เรียบร้อย 迦太基 ใช้รือถ้าใครใช้迦太基ก็ใส่ลงไปใน Cartfile ว่า github“ kasketis / netfox” ็จแล้วก็ carthage update –platform iOS –cache-builds ได้เลย(อย่าลืมปรับ命令ดูได้ที่https://medium.com/@phai/84cf004cb35c) 应用程序代码应用程序代理功能应用程序完成FinishLaunchingWithOptions 迅速 อย่าลืม import netfox NFX.sharedInstance()。start() 目标C [[NFX […]

#iOS #Swift #Application中的#LocationServices

iOS无法直接访问该位置。如果要在iOS中使用该位置,我们需要征得许可。 要求许可取决于两个因素: 在应用运行时询问用户的位置。 在不运行时询问用户的位置。 有时您会同时需要这两个位置权限,例如,创建一个显示您当前位置到最近商店的距离的应用程序。 为此,您仅在使用应用程序时需要位置。 但是,如果您使用的应用程序每次用户更改位置时都需要更新位置,那么即使该应用程序未运行,您也将需要访问该位置。 如果您需要访问自己的位置,则需要在应用程序的info.plist文件中更改密钥。 密钥的更改取决于您的要求,是您需要“始终访问”还是仅在“使用时”。 更改info.plist文件的过程如下所述: 1.创建一个新项目,然后在项目导航器窗口中选择项目名称,该窗口是项目导航器中最顶层的文件。 2.然后在右侧窗口中,选择顶部的信息选项卡。 在此处阅读更多内容>> 如何在iOS Swift应用程序中处理位置服务

适用于初创企业的Firebase。 是还是不是?

几天前,我们的一个潜在客户伸出援手,问我们Firebase是否适合他们的移动项目。 他们是一家旅行社,为世界各地的包机服务,需要内部使用的应用程序。 他们需要一个iOS专家团队来发展他们的想法,这就是他们向我们提出的要求: 我想从您那里了解Firebase是否是我们项目的良好解决方案。 将来,我们希望将Firebase用作新网站的后端,我们也需要对其进行更新。 由于启动时只有两个人,所以我的回答是: Firebase对于大多数项目而言都是出色的-确实非常方便,并且由于您仅在启动时使用该应用程序,因此您无需为Firebase支付一毛钱,因为您不需要大量的带宽/连接。 Firebase是一种多合一的后端解决方案,您可以随用随付。 换句话说,您只需要在赚钱时付款即可(又名您的应用程序受欢迎并且许多用户使用它)。 总的来说,我认为这值得权衡。 我们在cesare上每天都会使用该平台,这就是它如此吸引人的原因: 我们构建的大多数应用程序都需要某种身份验证。 Firebase为您提供了不同的身份验证方法:通过电子邮件和密码,社交帐户(Facebook / Google / Twitter / GitHub)和电话号码(您向Google提供电话号码,然后Firebase向用户发送他们必须输入的验证码)该应用程序)。 验证用户就像编写几行代码一样容易。 Firebase可让您的用户进行身份验证,注册,重置密码和验证电子邮件。 如果您想节省开发时间(“快速移动并破坏工作”),也可以便宜使用预先构建的身份验证界面。 它被称为FirebaseUI,它是免费和开源的(尽管在我看来,它看起来并不那么好)。 Firebase有一个实时数据库,您可以在其中存储数据。 数据被分组到不同的“节点”中,这使整个事情与您可能习惯的(MySQL / Parse表)有很大不同。 在Firebase中,您定义了一些节点,例如“用户”,“邀请”,“项目”,然后添加了子节点(这些节点的子节点)。 您可以直接从界面添加/删除数据: 从此处的官方文档中了解有关使用Firebase构造数据的更多信息。 Firebase数据库的优点在于,每个平台(Web,iOS和Android)都可以访问它,从而使在设备和平台之间同步数据变得非常容易。 这意味着如果您决定今天构建一个iOS应用程序,则由于所有数据都存储在一个地方,因此您仍然可以构建一个Android应用程序。 问题在于,如果您想输入新数据,则此数据库界面可能会有些混乱且难以处理,因此许多客户要求我们构建一个网络仪表板(我们使用Google表格或Zapier),他们可以在其中添加或更改应用程序中显示的数据。 动态链接非常棒,因为在点击动态链接后,它们会将用户直接带到应用程序(如果未安装您的应用程序,则将用户带到应用程序商店或Play商店)。 链接可以包含大块数据(引用代码),从而实现全新的可能性(例如,用户可以使用它们邀请新成员加入组或项目并为此奖励)。 我们在一些项目中使用了动态链接,这些链接要求用户向其他用户发送“邀请”以加入小组。 Firebase为开发人员提供了内置的动态链接生成器,用户A可以使用该链接生成器来邀请用户B。用户B点击包含一些数据的链接,并将其重定向到应用程序(可以根据进行自定义用户流)。 这些只是我们真正喜欢Firebase的一些功能-我们每天都在使用它,我们的客户喜欢它,因此可以随时在Firebase上试用一下。 我个人计划在黑客马拉松上使用Firebase并开发一个GitHub库,用户将可以使用该库来调用Firebase函数-使其非常易于采用。 我相信Firebase是每个初创公司都必须使用的。 如果您在设置Firebase方面需要帮助,或者希望我们采纳您的启动想法并将其变为现实,我们可以为您提供帮助。 请在此处联系我们,我们将竭诚为您服务。

UITableView的自定义节标题

最近,作为iOS开发人员,有两种设计引起了我的注意:水平列表和自定义节标题。 开发人员和设计师为此付出了巨大的努力,因为应用程序的几乎所有部分都由表格视图组成。 由于水平列表不在本文的讨论范围之内,因此我打算只专注于制作自定义节标题。 老实说,制作自定义节标题不需要很大的努力。 我们将从包含TableViewCell的TableViewController开始。 根据您的选择,可以从TableViewController开始,也可以将TableView放在ViewController中。 我选择了最后一个。 下一步将添加带有其类的新xib文件。 我们将在另一个文件中设计节标题。 我喜欢部分地做事。 无论是简单还是困难,我都喜欢使用这种方法。 在这种情况下,这是必须的。 因此,添加一个Cocoa Touch类作为UITableViewHeaderFooterView的子类。 如果习惯于用类一起创建xib文件,您会感到惊讶,在这种情况下是不可能的。 我们应该单独创建一个xib。 您可以从“用户界面”部分执行此操作。 选择查看。 在添加新的xib时,您将意识到视图大小已固定。 您应该将大小选项从推断更改为自由格式,以使视图的大小可调整大小。 现在,您可以随意给节标题添加形状。 在本教程中,我们将仅添加两个标签,一个添加为大标题,而另一个添加为副标题。 形状良好后,为此在视图上放置两个标签。 我们一切都好。 不用说,在UITableViewHeaderFooterView子类中创建这些标签的出口。 我给此类命名为CustomSectionHeader。 这些出口分别命名为titleLabel和subtitleLabel。 现在,我们完成了这些类和xib文件。 无所事事。 仅要做的一项工作是我们应该在表视图中注册此xib。 您应该添加的最后一个代码如下: 仓库:https://github.com/onurtuna/custom-section-header