Tag: 编码

自学系列| iOS Swift | 第二课:介面开发(UIKit)第1部分

前言:为什么会有「自学系列」 当我还是程式初学者时,觉得自学最麻烦的就是:那些课程大纲,专有名词我根本看不懂。如果有个已经会的人直接跟我说要学什么,给我一个概述,可以省下很多时间。 关于iOS App自学系列我已经写了两篇,有兴趣可以去看看。 自学系列| 斯威夫特| 用免费的线上学习资源入门iOS App 初学者到底有什么基本东西要学? medium.com 自学系列| iOS Swift | 第一课:开发工具+ App基础观念+基础UI 用AVFoundation做一个简易变声App medium.com 简介文章是Udacity iOS应用程序Nanodegree第二课的导读,透过做成这个影片中的App,熟悉介面开发常见的几个元素。 第二课连结在此 ,我们将学会底下几个主题。 UIKit基础知识:了解iOS用户界面库| Udacity 了解iOS UIKit框架,这是在所有iOS应用程序中创建用户界面的基石,对任何其他应用程序都至关重要。 www.udacity.com 1.重点观念 代表 Delegate对初学者而言是一个逃不掉的魔咒,记得自己初学Delegate时,不懂为什么要有这种东西,只会一个案例,一个案例照抄。三个月后大概可以不再参考案例,顺顺地自己写出Delegate,直到最近写这篇文章,我才觉得有点理解它了。 先帮大家打个预防针: 有时候学东西是这样:先照抄➙会自己写➙练习很多很多次之后,终于理解为什么要这样写。 Delegate是代理人的意思,在上一篇有提提过,它是一种写程序的方法(设计模式),用于当A想叫B做事情的时候。还记得MVC吗?View(介面)负责呈现画面给用户,Controller则是负责处理逻辑,例如Controller会根据一些逻辑,告诉查看现在要变成什么画面。 所以,很多时候查看会分配控制器为Delegate(代理人),问Controller现在要如何呈现自己。 举凡为呈现多种资料的UITableView,UICollectionView,呈现文字的UITextView,UITextField,选择日期,数字的UIPickerView …等等,都会用到Delegate。 协议就是这样的东西,遵从Protocol的代表就会有要执行的功能。底下用UITextField视为示例。 UITextField UITextField用于输入文字(如左图红色框局部)。 在第二课的范例中(右图),三个TextField的文字呈现都不同,表示这三个TextField是不同的代理人(代表): 第一个Delegate可以把动物的单字变成表情符号(例如cat变成🐱) 第二个Delegate会根据单字改变句子的颜色(例如红色) 第三个Delegate会算出句子的字数 这三个Delegate都遵从UITextFieldDelegate这个协议,所以当我们输入文字时,三个代理人就要执行该协议 func textField(UITextField,shouldChangeCharactersIn:NSRange,replaceString:String) 这个功能,差异只是功能里的逻辑要写什么,决定文字会怎么变。就像外交官出席活动一定要发新闻稿,但新闻稿内容要写什么,则因人而异。 2.资料呈现 UITableView / UICollectionView 仔细观察的话,你会发现多数的App都用到TableView或CollectionView。 TableView就是一行一行排下来的,像iPhone内建的设定(左图),Line,Messenger,邮件,备注,YouTube,Facebook …等等,CollectionView则是一格一格的,像instagram(右图),照片,旅行青蛙购买道具和放明信片的页面…等等。 TableView跟CollectionView都要用到Delegate(所以Delegate真的逃不掉!),以TableView来说,就有UITableViewDelegate,UITableViewDataSource这两个。UITableViewDelegate负责处理使用者产生的行为,例如当使用者点选表格,编辑表格时,要怎么回应; […]

在Swift 4中将日期转换为字符串的简单方法

斯威夫特是一门出色的语言。 它相对容易学习并且非常直观。 虽然有些事情不是那么简单。 例如,如果您想将数字转换为字符串,则有很多方法。 字符串(数字) “\(麻木)” 但这不适用于日期。 您可以通过调用Date()获得当前日期,但是如果您想填充一个需要字符串的核心数据对象,该怎么办-但您仍然想显示一个日期呢? 如果您想以可读格式输入日期怎么办? 您需要使用日期格式化程序,将其转换然后输出一个字符串。 我一遍又一遍地做这件事,直到我决定创建一个非常简单的函数为我做。 因此,我可以再次将其发布到这里,但这意味着在搜索解决方案时在页面上迷路的任何人都可以使用它。 func formatDate(_ dateString:Date)->字符串{ 让dateIn = dateString 让dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.timeStyle = .short dateFormatter.locale =语言环境(标识符:“ en_GB”) 返回dateFormatter.string(from:dateIn) } 只需将该函数放在所需的快捷页面中,然后调用它即可。 您可以在参数字段中使用Date()来获取当前日期或以日期格式传递任何日期。 让dateString = formatDate(Date()) 然后它将输出一个可以使用的字符串值。 该方法以编码格式编写,因此,如果要将其更改为长,短或无时间/日期,只需更改函数中的dateStyle和timeStyle元素即可。 如果您需要多次日期转换,则甚至可以在参数中传递这些参数来设置它们。 func formatDate(_ dateString:Date,dateStyle:DateFormatter.Style,timeStyle:DateFormatter.Style)->字符串{ 让dateIn = dateString 让dateFormatter = DateFormatter() dateFormatter.dateStyle = dateStyle dateFormatter.timeStyle = timeStyle […]

在Swift中逐步实现委托。

那么,代表是什么? …在软件开发中,有通用的可重用解决方案体系结构可帮助解决给定上下文中常见的问题,可以说这些“模板”被称为设计模式。 委托是一种设计模式,当特定事件发生时,该模式允许一个对象向另一个对象发送消息。 想象一下,对象A调用对象B来执行操作。 一旦动作完成,对象A应该知道B已完成任务并采取必要的动作,这可以在代表的帮助下实现! 为了获得更好的解释,我将向您展示如何创建一个自定义委托,该委托在简单的应用程序中使用Swift在类之间传递数据,首先下载或克隆此启动程序并运行它! 您可以看到一个包含两个类的应用程序,即ViewController A和ViewControllerB。B有两个视图,这些视图可以在点击时更改ViewController的背景颜色,没有什么太复杂了吧? 好了,现在让我们以一种简单的方式来考虑,当点击B类的视图时,它也可以更改A类的背景颜色。 问题在于该视图是B类的一部分,对A类不了解,因此我们需要找到一种在这两个类之间进行通信的方法,这就是授权的亮点。 我将实现分为6个步骤,因此您可以在需要时将其用作备忘单。 步骤1:在ClassBVC文件中寻找实用标记步骤1,并添加此 //MARK: step 1 Add Protocol here. protocol ClassBVCDelegate: class { func changeBackgroundColor(_ color: UIColor?) } 第一步是创建一个协议,在这种情况下,我们将在B类中创建该协议,在该协议内,您可以根据实现的要求创建任意数量的函数。 在这种情况下,我们只有一个简单的函数,它接受可选的UIColor作为参数。 命名协议的一种好习惯是在类名的末尾添加代理人一词,在本例中为ClassBVCDelegate。 步骤2:在ClassVBC中寻找步骤2的实用标记并将其添加 //MARK: step 2 Create a delegate property here. weak var delegate: ClassBVCDelegate? 在这里,我们只为类创建一个委托属性,该属性必须采用协议类型,并且应该是可选的。 另外,您应该在属性之前添加weak关键字,以避免保留周期和潜在的内存泄漏,如果您不知道那意味着什么现在就不用担心,只需记住添加此关键字即可。 步骤3:在ClassBVC的handleTap方法中查找步骤3的实用标记并将其添加 //MARK: step 3 Add the delegate method call here. […]

为什么Swift超过Objective c?

IT行业发展迅速。 对于移动应用程序开发,使用了各种编程语言。 长期以来,Objective C是用于创建OSX和iOS应用程序的主要编程语言。 如Wikipedia所述,Objective C是通用的,面向对象的编程语言。 Objective C编程语言最初是在1980年代开发的。 为了开发iOS应用,苹果在2014年带来了革命。苹果在2014年的全球开发者大会(WWDC)中推出了Swift作为一种新的编程语言。 由于Swift,开发人员找到了Objective C的替代品。Swift是一种功能强大且直观的语言,适用于iOS,OS X,电视OS和watchOS。 随着Apple删除了不安全的指针管理并引入了强大的新功能,Swift成为了Objective C的很好替代。 多亏了闭包,泛型和类型接口等许多关键功能,使用起来更加轻松。 根据RedMonk的说法,Swift将接管Objective C.2018年,Swift在十大编程语言中排名更高。 逐渐地,Swift成为开发人员的最爱。 Swift快速,安全,现代化,并在开发中实现了一定程度的交互性。 Swift有潜力创建引人入胜的,灵活的,对用户友好的应用程序。 苹果推出Swift之后,iOS世界中发生了许多争论。 Swift已成为许多组织讨论的中心。 无论是选择Objective C还是Swift,都成为开发人员永无休止的争论。 Swift是一种有效的编程语言。 为了了解Swift是更好的还是Objective C,我们需要确定Swift和Objective C之间的关键特性。毫无疑问,Swift解决了Objective C的许多缺点。即使根据Upwork,Swift是增长最快的技能适用于初创企业和自由职业者。 让我们了解为什么Swift比Objective C更好。 在Objective C上使用Swift的原因 1少代码 Swift是用于编程的更紧凑的语言。 使用Objective C,有很多导致应用崩溃的问题。 Swift减少了重复语句和字符串操作所需的代码量。 在使用Objective C时,您将需要组合两个字符串以使其冗长。 而且,类不分为两部分:接口和实现。 这样可以将项目中的文件数量减少一半,这使得处理起来更加容易。 因为在Swift中,程序员不必更新和维护两个文件。 让我们以著名的应用程序Lyft为例。 该应用已用Swift重写。 您会惊讶地发现应用程序代码从75000行增加到25000行。 与Objective-C冗长的编码相比,Swift最终使您的工作更加轻松。 2更快 与C ++一起,Swift是程序员最快的编程语言。 Swift的速度将帮助您节省成本。 例如,复杂对象的运行速度比Python中相同算法的实现快3.9倍。 它实际上比Objective C更好,后者仅比Python快2.8倍。 2014年12月,Primate […]

Swift 4中的编码和解码

我知道我知道你一定像Swift 4 WTF! 不用担心,Swift 4尚未发布,但是您仍然可以使用Swift开发快照来体验Swift 4的功能。 如果您有兴趣安装Swift 4快照,请查看此链接。 有许多不同的方案,您要将类转换为数据表示形式。 一个非常普遍的需求是当您想将JSON数据作为HTTP正文发布时。 最常见的方法之一如下所示: JSONSerialization类负责返回Data对象,然后可以将其作为HTTPBody传递给请求。 Swift 4中的JSONEncoder和JSONDecoder Swift 4引入了JSONEncoder和JSONDecoder类,它们可以轻松地将对象转换为编码的JSON表示形式。 查看以下示例: 注意,使用了新的Codable协议,该协议使Language结构可编码和可解码。 更高版本的JSONEncoder类用于通过使用encode函数执行编码。 就像编码一样,解码也非常简单,如以下代码所示: 很简单吧! 通过使用协议和扩展,我们甚至可以使它更简单。 让我们创建一个自定义的Serializable协议,它将为我们执行编码。 可序列化 使用JSONEncoder和JSONDecoder很好,但是我们当然可以使它更无缝地执行编码和解码。 代替创建JSONEncoder的实例,类或结构应该能够自己编码。 看一下下面的Serializable协议,所有对编码感兴趣的模型都可以遵循该协议。 代替在每个类或结构中分别实现序列化功能,我们将使用协议扩展的功能来创建默认实现。 上面的代码将给您以下错误: 游乐场执行失败:错误:MyPlayground.playground:8:36:错误:参数类型“ Self”与预期的类型“ Encodable”不符 返回尝试? encoder.encode() 问题在于“自我”不是可编码的。 我们可以通过使Serializable协议符合Codable协议来轻松解决此问题,如下所示: 现在,您可以使用新的Serializable协议轻松编码模型,如下所示: 确保您的语言模型符合“可序列化”协议而不是“可编码”协议。 我相信,在构建依赖于网络服务并发布编码数据的应用程序时,Swift 4中的这些新进步将真正使开发人员受益。 我可以担任高级iOS开发人员。 如果您有兴趣,请在此处查看我的简历。 如果您喜欢这篇文章,那么您可能会对我的课程“ iOS精益控制器的完整指南 ”感兴趣。 本课程涵盖许多有用的架构模式,以构建更好的iOS应用程序。 享受74%的折扣,请单击以下链接: https://www.udemy.com/a-complete-guide-to-lean-controllers-in-ios/?couponCode=MAKEMELEAN

开源故事:从缓存中的可缓存到通用存储

目录 快取 可携带 异步 JSON格式 Swift 4中的可编码 责任链 什么是TypeWrapper? StorageAware协议 同步与异步 但是图像不符合Codable 解决 怎么样? 数据可转换怎么样? 数据生产者呢? 通用存储 转换类型 存储感知 变压器 转换功能 从这往哪儿走 我们从事开源已有一段时间了,您可能已经在GitHub上遇到了我们的一些工作或阅读了一些故事。 我们并没有尝试重新发明轮子,但是有许多我们需要专门用于工作流的组件,或者需要针对正在构建的应用程序进行自定义的组件。 因此,我们构建了许多框架和应用程序。 当我们在生产应用程序中使用它们时,我们认为与世界分享它们可能是一个好主意。 这是双赢的局面,因为我们回馈了社区,同时获得了很多反馈和建议。 作为一个小型的iOS团队,全职进行客户项目,同时尝试腾出一些空闲时间来从事开源工作是非常具有挑战性的。 开源就是建立抽象。 通过分离职责并创建可重用的框架,我们可以充分了解Swift的知识,并掌握有关正在使用的API的一些精妙的细节。 但是我们从未告诉过我们如何做事。 因此,将会有一系列我们的开源故事,详细介绍我们工作背后的技术方面,只要有开源经验即可。 首先,让我们谈谈缓存,一种持久化对象的框架。 在这里,我们将学习如何开发API以支持Swift语言和iOS,tvOS平台的新功能,同时确保它们足够灵活和可维护。 缓存并没有声称在该区域是唯一的,但是它并不是另一个为您提供神力的怪物库。 除了缓存,它什么也没做,但它做得很好。 它提供了良好的公共API,具有现成的实现方式和巨大的自定义可能性 在iOS平台上可以有许多用于缓存的解决方案,例如SQLite,CoreData或Realm或其他第三库。 我们想要从Cache中获得的是一种简单的方法,可以将一些JSON数据存储到磁盘,到期管理和我们熟悉的API。 从用户的角度来看,我想使用键可靠地保存和加载对象,并具有同步或异步执行此操作的能力。 这是我们旨在实现的API。 在第一个版本中,由于对象应该被序列化并反序列化为用于磁盘存储的Data ,因此我们引入了Cachable协议。 我们还使大多数原始类型都符合Cachable,因此用户不必自己执行此操作。 对于内存存储,我们在NSCache使用NSCache ,因此对象将按原样保存。 缓存基于具有前缓存和后缓存的概念。 对前端缓存的请求应减少时间和内存消耗(此处默认使用NSCache )。 正面和背面缓存之间的区别在于,背面缓存用于超出应用程序生命周期的内容。 看到它更像是一种方便的方法,用于存储应在应用程序启动期间持续存在的用户信息。 磁盘缓存是这里最可靠的选择 HybridCache具有具有Cachable类型约束的泛型函数,因此对于所有Cachable一致性它都是类型安全的 甚至对于自定义类型和UIImage 异步 […]

如果您绝对是学习iOS开发的初学者,请使用Ditch故事板。

如果您是熟练的iOS开发人员,Internet上将充满信息,这些内容涵盖了程序化视图相对于情节提要的优势。 如果您正在阅读此书,则可能是您想学习或正在学习iOS开发。 在这篇文章中,我将简要提及为什么即使是绝对的初学者也应该避免使用故事板。 对于初学者,重要的是要了解在iOS应用开发中创建视图时有两种不同类型的方法-一种是使用Storyboard创建视图,另一种是以编程方式创建视图。 首先,由于您可以轻松创建视图,因此故事板似乎是一个非常有吸引力的选择。 由于其拖放功能,它几乎使有抱负的iOS开发人员感到无敌,直到他们遇到一个更复杂的项目并遇到麻烦为止。 突然之间,您将需要为模型和控制器编写复杂的代码,而从无与伦比的下降将感觉像是跳伞失败的跳伞。 这就是为什么我建议您始终开始使用第二种方法(程序化视图)来学习iOS开发,同时避免使用称为Storyboards的学习曲线快捷方式。 当开发人员使用情节提要来创建应用程序的视图时,开发人员通常会花费超过50%的开发时间来创建情节提要。 这是您本可以用来在Swift中实现流利度的大量开发时间。 另一方面,学习以编程方式创建视图将迫使您仅专注于实际学习Swift,了解逻辑并习惯语法。 这绝对是学习Swift(和/或Objective C)语言并提高您的编码技能的最佳方法。 对我来说,这是为什么您应该通过编写视图代码来开始学习iOS开发和Swift的最大原因。 与情节提要相比,编程方法还有许多其他优点。 我认为,两个最重要的优点是: 程序视图导致快速的开发周期。 一旦开发人员习惯于以编程方式创建视图,则与使用情节提要板相比,可以更快地创建视图。 一切都与应用程序开发的速度有关。 如果使用程序化视图创建应用程序,则与大型开发团队进行协作会容易得多。 使用情节提要进行共享和协作非常困难。 已经有足够的讨论了。在下一篇文章中,我将向您展示如何使用“自动”布局以编程方式创建视图,并向您展示最简单的方法。

具有Kitura编码路由的服务器端Swift CRUD API

Kitura是IBM创建的服务器端Swift Web框架。 它已获得MIT许可,免费使用,并且源代码是开放源代码。 最近,随着2.0版本的发布,Kitura团队引入了新的Codable Routes功能,这使开发人员可以非常轻松地使用Swift 4 Codable自动处理URL请求和响应。 Swift 4引入了Codable协议,这意味着实现Codable协议的类型能够将其属性解码和编码为任何外部表示形式,例如JSON。 在语言级别上,许多原始数据类型(例如Int,String,Double,Data,URL)已经是Codable类型,包含Codable类型的Array和Dictionary也已经是Codable类型。 struct TodoItem:可编码{ var id:字符串 var标题:字符串 var内容:字符串 } //将TodoItem结构编码为JSON数据 让todoItem = TodoItem(id:“ 1”,标题:“ hello”,内容:“ world”) 让jsonData =试试! JSONEncoder.encode(todoItem)//将JSON数据解码为TodoItem结构 让todoItem2 =试试! JSONDecoder.decode(TodoItem.self,来自:jsonData) 使用内置的JSONEncoder和JSONDecoder类的Swift,从JSON编码和解码可编码对象,反之亦然。 使用Codable,我们不必手动解析JSON或使用第三方库(如SwiftyJSON)进行解析。 可编码的工作就像魔术一样。 使用Kitura Codable Routes,我们可以创建一个Router终结点方法,该方法接受请求的Codable对象,并将完成闭合传递给该Codable对象作为响应。 作为开发人员,我们不再需要手动编写编码和解码逻辑。 要查看所有这些操作,让我们使用内存数据存储区为TodoItem构建一个CRUD API。 进口Kitura 导入KituraContractsstruct TodoItem:可编码{ var id:字符串 var标题:字符串 var detail:字符串 } var todos = [ TodoItem(id:“ 1”,标题:“清理房子”,详细信息:“我的房子”), TodoItem(id:“ […]

与杜鹃和代码生成保持一致

请注意 ,由于README为该库提供了很好的介绍,因此本文不会涉及Cuckoo的基础知识。 您是否编写单元测试? 你应该。 在Objective-C中为我的测试编写模拟程序似乎要容易得多。 OCMock充分利用了Objective-C的动态特性,使模拟变得轻而易举。 但是,OCMock网站上有这样的说法: 令人失望。 准确。 好吧,出发寻找替代方案。 我能找到的最好的东西是SwiftMock,但这带来了更加尖锐的失望: Swift似乎缺乏反射性,这意味着我们注定要手动做事并一次又一次地重写相同类型的代码。 因此,我采取了自己的模拟游戏。 它没有那么坏。 真。 我基于Mock协议并使用Swift的基本反射构建了自己的Mock框架,在TDD的世界中,所有人都感到很高兴。 当您编写大量代码以及应附带的所有测试时,为模拟编写样板的所有时间都很累。 我渴望更高效的东西。 然后,我被介绍给杜鹃。 Cuckoo是Swift的一个模拟框架,它使用代码生成来创建您自己编写的样板。 它具有很多功能,我认为这些功能过于繁琐和重复,无法自己完成。 它还可以确保一致性,这是我在手工模拟世界中非常缺乏的东西。 代码生成与反思 大多数编程语言使用反射来动态执行某些事情,否则我们将不得不为其编写重复的样板。 OCMock使用反射来创建模拟对象。 实际上,它不会为您要模拟的每种类型创建一个新类。 反射允许像Objective-C这样的语言来动态创建模拟,检查是否相等以及执行JSON序列化。 到目前为止,在Swift中这并不是一件容易的事。 Swift语言避免了动态行为,并鼓励使用更安全的方法。 另一方面,代码生成非常适合Swift的类型安全性。 您拥有可以被人类阅读并可以由编译器验证的代码。 起初我觉得很奇怪。 我可能没有写样板,但它仍然存在。 由工具编写并隐藏在后台。 但这似乎是像Swift这样的语言的前进方向。 诸如Sourcery和SwiftGen之类的框架使您可以为这些任务采用代码生成,否则可以通过反射来完成。 缺乏反射和强大的类型安全性意味着在减少您花在单调任务上的时间和更多时间在应用程序重要部分上的工作时,代码生成是新的入门方法。 布谷鸟使用代码生成比反射方法具有许多优势,例如类型检查,优化以及逐步调试生成的代码的能力。 不用发疯地使用杜鹃 布谷鸟已经变得更加易于使用,并且需要反复尝试。 这是到目前为止我已经学到的一些见解。 熟悉ParameterMatchers 看这个例子: stub(mock) { stub in when(stub.greetWithMessage(“Hello world”)).thenDoNothing() } 当传递字符串“ Hello World”时,我们将greetWithMessage对greetWithMessage函数的调用行为。 重要的是在此处注意,代码实际上并不期望使用String对象。 它期望一个Matchable […]

NSO操作

服务的优先级和质量 优先级(NSOperation.queuePriority)与枚举一样,具有以下选项: 。非常低 。低 。正常 。高 。很高 服务质量(NSOperation.qualityOfService)具有以下选项: 。效用 .UserInteractive 。用户启动 。默认。 。背景 优先级和服务质量越低,与其他任务相比,任务将在队列中移得越远。 依存关系 let operationOne:NSOperation =… let operationTwo:NSOperation =… operationTwo.addDependency(operationOne) 让operationQueue = NSOperationQueue.mainQueue() operationQueue.addOperation([operationOne,operationTwo],waitUntilFinished:false) 在这种情况下,operationTwo依赖于operationOne,因此operationTwo必须在operationOne完成之前才能运行。 确保不要使operationOne依赖于operationTwo和operationTwo依赖于operationOne,否则将产生死锁。 完成区块 NSOperation完成后,它将运行一次其完成块。 let操作= NSOperation() operation.completionBlock = { 打印(“完成!”) } NSOperationQueue.mainQueue()。addOperation(操作) NSBlockOperation 块操作类似于操作,但是可以将任务放在块中,而不是将操作子类化。 这会将operation2添加到队列中,然后将operation1添加到队列中。 它将首先执行operation2的块,然后执行operation1的块。 GCD与NSO 使用GCD的好时机: 一次计算 加快现有方法 需要轻巧的东西 使用NSOperation的好时机: 需要取消并了解其运行状态 需要安排一组依赖项 同时使用GCD和NSOperation可以使您的应用程序非常时尚。 在Twitter @anthonyprograms上关注我,并查看iOS纪事以获取更多文章。