Tag: swift

Swift 4.2中的委派模式

什么是协议? 根据 Apple文档 – 协议定义了适合特定任务或功能的方法 ,属性和其他要求的蓝图 。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 除了指定必须符合标准的类型的要求之外,您还可以扩展协议以实现这些要求中的某些要求,或者实施符合标准的类型可以利用的其他功能。 在SwiftTable语言中开发UITableViewDelegate和UITableViewDataSource基本表视图时,您已经看到了很多次的协议 。 两种协议都有其自己的方法是必需的和可选的。 如果您已经在Apple的框架中看到过。 如果您按命令键( ⌘ )并单击鼠标左键,则在 UITableViewDataSource上 可以看到这些选项– 现在单击“跳转到定义”,您将看到他们的协议方法–

屏幕快照de uma ScrollView no iOS(Swift)

Opróximodesafioestásemper virando esquina de nossas vidas e um dos desafios bacanas que tenho para passar dessa vezéfazer um print do content completo de uma scrollview 。 可以在UIImage中进行滚动转换。 Vejamos o passo-a-passo eocódigocompleto。 UIScrollView的重要uma 扩展, 从 toImage到 ui UIImage ; 使用UIGraphicsBeginImageContext com contentSize; Armazenar: contentOffset,frame,showsVerticalScrollIndicator和showVerticalScrollIndicator 。 阿西姆·波德莫斯(Assim Podemos Retornar)认为自己不动产。 Colocar showsVerticalScrollIndicator和showHorizo​​ntalScrollIndicator参数为 false。 Nãoqueremos滚动显示图像; Setar contentOffset参数 CGPoint.zero。 Queremos […]

Swift后端的应用程序监视,首次更新

起始时间 自上次更新以来,发生了很多事情,我们想向您介绍我们的进展。 首先,让我告诉您更多有关我们的身份以及我们这样做的原因。 我和Alex五年前在SaaS产品上一起工作,并且在那时也成为好朋友。 Alex为生活设计产品时,我是一名软件开发人员。 在过去的几年中,我一直在为iOS开发,并在此之前使用Node.js和C ++。 我认为,无论使用哪种语言,开发人员工具都是日常工作中令人沮丧的一部分。 我希望您喜欢Xcode,但是……令人困惑的是,我们开发人员没有花足够的时间来使我们的工具更锋利,因为从长远来看,即使工具效率提高5%,也可以节省大量资金。 尽管创建了如此多的编程语言并发布了这些语言的库,但是整个开发过程仍然受到早期计算的启发,当时唯一的输入方法是文本。 看来,对其进行现代化的努力还不够集中和不够完善。 想出一个主意 当Swift宣布具有许多当时被认为是“学术性”语言的功能时,我对它印象深刻。 开源Swift使我们更接近成为全栈开发人员,并将其带入所有其他生态系统。 在那个时候,我围绕着开发人员工具研究自己的一些想法。 如果我们拥有GitHub,但对于iPad上的Swift Playgrounds,又能够轻松地在操场上共享代码,跟随其他人和他们在Swift上的经验,该怎么办? 如果您可以花最少的精力在云中运行Swift代码而不用担心服务器和可伸缩性怎么办? 所有这些都可能是个好主意,我很乐意看到有一天将它们付诸实践🙂 这使我对在Linux上运行具有很多潜在潜力的Swift产生了兴趣。 除了能够为多个平台编写代码之外,Swift本身在这个领域中处于有利地位,唯一可比较的语言是Rust和Go。 Swift在其生成的可执行代码中在可读性/简单性和CPU / RAM占用空间之间取得了良好的平衡。 这方面存在信息空白,我试图填补七月份发布的时事通讯。 订阅者的数量(每周增长5-10%)和内容量证明了我的假设。 非常感谢我们的读者以及所有为服务器端Swift生态系统做出贡献的人们,没有您,这个新闻通讯将无法实现! 这使我确信,可以在生态系统增长的早期阶段对开发人员工具产生最佳影响。 好像我找到了一个合适的人选。 从简单的事情开始是合理的,应用程序监视和检测似乎是一个不错的选择。 事实证明,对于Linux上的Swift,在这方面没有做太多事情。 亚历克斯喜欢这个主意,我们想证明确实有此需要。 验证想法 在将近一个月前启动了Astrocat的目标网页后,我们已经对这件事产生了浓厚的兴趣。 令我们惊讶的是,有多少人已经在生产中使用Swift,而提高后端稳定性和性能的工具将大有帮助。 我们看到了对崩溃报告和仪表工具的明确需求,并对未来产品有了清晰的愿景。 Astrocat的第一个版本将是一个集成在后端中的库,该库会将崩溃和错误报告发送到我们的服务器或本地托管的服务器。 基于这些事件,它通过电子邮件,Slack集成,推送通知等向您发送通知。

iOS中的网络调试-netfox

如今,许多应用程序都使用某种HTTPS API,其中有大量的库(Alamofire,Moya,AFNetworking等),并且我在Medium上看到了许多有关网络体系结构的文章。 但是有一件事,几乎没人谈论—网络调试。 错误是软件开发的正常部分,可以在它的每个部分(包括网络)中找到。 什么是netfox? 对于任何需要在其应用程序中调试网络的iOS或macOS开发人员而言,Netfox都是一个很棒的库。 您可以在netfox GitHub README中阅读有关它的更多信息。 Netfox入门 使用netfox入门非常简单。 它支持两个主要的依赖管理器-CocoaPods和Carthage。 // CocoaPods pod’netfox’ //迦太基 github“ kasketis / netfox” 如果您希望手动将库添加到项目中,请 参阅netfox GitHub README中的说明 。 添加库后便是最好的部分-要启用netfox日志记录,您只需向AppDelegate添加一行代码即可。 就这样,您不需要任何其他东西,也不管您如何处理网络请求(Alamofire,AFNetworking等)。 NFX.sharedInstance()。start() 将此行添加到AppDelegate,didFinishLaunchingWithOptions中。 不要忘记导入netfox。 查看您的日志 Netfox将在后台记录您的所有网络请求。 有两种方法可以打开netfox日志屏幕(图2): 1)手势 NFX.sharedInstance()。setGesture(.shake) 在您的AppDelegate中的“ NFX.sharedInstance()。start() ”下添加以下代码行。 要打开网络日志屏幕,只需摇动您的iPhone,它将自动打开。 2)代码: NFX.sharedInstance()。show() 这行代码也将打开网络日志。 例如,您可以在按钮的@IBAction中调用它。

使用diff框架更新Swift中UICollectionView数据的更好方法

熟悉的朋友 通过iOS中的UITableView , NSCollectionView ,macOS中的tvOS或NSTableView , NSCollectionView NSTableView ,很难想象没有使用表视图或集合视图的应用程序。 大多数时候,我们从后端,缓存和过滤器中获取数据,以列表或网格形式显示该数据。 之后,当数据更改时,我们将更新您的界面以反映某些项目已被插入或删除。 那就是您最喜欢的函数出现的地方reloadData 。 这样,整个列表将以全新的内容刷新。 当您需要快速刷新内容的方案时,这是很好的选择。 但这会使UITableView再次使单元格大小无效,这会降低性能。 此外,如果这些更改应引起注意,并且您想让用户更好地了解发生了什么,那么最好手动插入和删除行。 如果您使用的是Android,则可能知道不用调用notifyDataSetChanged ,而可以使用提供的DiffUtil为我们计算更改,从而使RecyclerView更新变得容易。 不幸的是,您在iOS中没有那么奢侈,但是我们可以学习如何做到这一点。 本指南以UICollectionView为例,但UITableView行为相同。 对于在Google上搜索NSCollectionView任何人来说,这都有点困难: 拖放 让我们看UICollectionView情况。 想象一下一个应用程序,在该应用程序中,用户可以通过将项目从一个集合移到另一个集合来自定义其体验。 您可以看一下示例DragAndDrop,它在iOS 11中使用了新的拖放API。 在UICollectionView上调用更新方法之前,必须确保数据已更改。 然后我们调用deleteItems和insertItems以反映数据更改。 UICollectionView为您执行漂亮的动画 索引与偏移 在我们进行进一步讨论之前,我只想提及一下,实际上是指从一开始的offset 。 如果您看一下枚举函数,它建议使用名称作为偏移量而不是索引 编辑距离 手工进行这些计算非常繁琐且容易出错。 我们可以使用一些算法来构建自己的抽象。 天真的是Wagner-Fischer算法,该算法使用动态编程来告诉两个字符串之间的编辑距离。 编辑距离是指从一个字符串更改为另一个字符串所需的步数。 字符串只是字符的集合,因此我们可以推广这个概念以使其适用于任何项目集合。 而不是比较字符,我们要求项目符合Hashable 。 从“套件”到“ kat” 我们如何将“套件”一词的形式转换为“ kat”? 我们需要执行哪种操作? 您可能会说“只是将字母i更改为a”,但是这个简单的示例可以帮助您理解算法。 让我们开始吧。 删除项 如果从“ kit”转到空字符串“”,则需要删除3次 “套件”->“”” 3个删除项 “ […]

Swift 3:使用单行输入的自定义UITextField

嗨,大家好! 这将是一篇简短的提示与技巧样式文章。 今天,我正在尝试(幸运地成功)构建了一个包含一个底线的自定义UITextField。 我敢肯定您之前看过,或者至少看过类似*的东西。 它并不复杂,但是使用自动布局时会变得棘手。 让我们看看如何首先制作这样的UITextField,您要做的就是创建扩展 扩展UITextField { func setBottomLine(borderColor:UIColor){ self.borderStyle = UITextBorderStyle.none self.backgroundColor = UIColor.clear 让borderLine = UIView() borderLine.frame = CGRect(x:0,y:Double(self.frame.height)—高度,宽度:Double(self.frame.width),height:height) borderLine.backgroundColor = borderColor self.addSubview(borderLine) } } 您可能想知道那里到底发生了什么,我将立即解释! 在我们设置透明背景并为文本字段禁用边框后,将创建UIView。 然后,将其框架设置为高度等于1.0的线,并通过以下y点计算将其放置在文本字段的底部 Double(self.frame.height)—高度 接下来是设置背景颜色,并准备添加子视图。 很简约! 现在,对于那些想要使用自动布局的人来说,棘手的部分是: 你不敢打电话 setBottomLine(borderColor:UIColor) 在ViewDidLoad()中,由于当时尚未应用所有自动布局规则,因此导致行为不确定。 要使其正确,只需调用viewDidLayoutSubviews()函数中的方法 覆盖func viewDidLayoutSubviews(){ 让lineColor = UIColor(红色:0.12,绿色:0.23,蓝色:0.35,阿尔法:1.0) self.myTextField.setBottomBorder(borderColor:lineColor) } 而已! 请让我知道这对你有没有用!

在Swift中对MVVM架构进行单元测试

为确保新代码不会破坏已经实施的旧代码,最佳实践是编写单元测试。 对于应用程序体系结构,编写这些测试可能是一个挑战。 遵循MVVM模式, 如何对视图及其viewModel进行单元测试? 这就是我想在这里使用依赖注入的内容。 MVVM体系结构的主要优点是将逻辑解耦并保持关注点分离。 每个类和文件都有特定的目标。 该代码保持模块化,可重用且易于测试。 测试用例应采用相同的逻辑:编写的每个测试仅覆盖一个用例,而仅覆盖一个用例,请隔离逻辑并确保其正常工作。 在此示例中,我还将保持关注点分离,一次测试一个元素。 我的意思是,对于MVVM模式,我至少要有3个测试文件:一个用于我的模型,一个用于我的视图,一个用于我的viewModel。 但是在深入研究代码之前,如果您不熟悉MVVM,我建议您先看一下我最近编写的实现MVVM模式的介绍。 准备您的viewModel 为了能够针对我的viewModel运行测试,我需要能够使用其他服务,并能够通过依赖注入来模拟我的服务。 第一步是为服务创建一个协议,然后将其实现到当前服务,最后更新视图模型。 我这就是我的协议和服务的样子 protocol CurrencyServiceProtocol : class { func fetchConverter(_ completion: @escaping ((Result) -> Void)) } final class CurrencyService : RequestHandler, CurrencyServiceProtocol { … } 然后我可以在viewModel中使用依赖项注入和默认参数 weak var service: CurrencyServiceProtocol? init(service: CurrencyServiceProtocol = CurrencyService.shared, dataSource : GenericDataSource?) { self.dataSource = dataSource self.service […]

新发布的Apple Swift Playgrounds是教导所有人进行编码的最佳方法

Swift是苹果公司提供的一种功能强大且直观的编程语言,自2014年以来一直存在。最近在星期一,在苹果公司年度最大的一次会议(世界开发者大会(WWDC)主题演讲)上,苹果公司介绍了其将近两年的编程语言。 Swift作为“ Swift Playgrounds”,适用于儿童和成人的iPhone和iPad应用程序,旨在弄清楚如何使用Swift进行编码。 苹果公司首席执行官蒂姆·库克说,苹果公司声称Swift Playgrounds是学习编码的最佳方式,甚至针对在校学生,他说:“我们相信这是教大家进行编码的绝对最佳方式,”并且还补充说:“我们相信所有学校都应该将代码作为必修语言。” 此外,在WWDC戏剧性演示的主题演讲中,苹果还展示了Swift Swiftgrounds的两个课程,包括构建一个简单的表情符号堆积游戏,其中有360名学生开发者获得了苹果颁发的奖学金。 该应用程序会提示客户确认重量和重力之类的东西,向他们演示代码更改如何影响游戏的制造和玩法。 更重要的是,Swift Playgrounds结合了一个自定义的iPhone控制面板,该面板具有通常使用的图像和功能,是Swift的一部分,以消除学习技巧。 但是,Swift Playgrounds如今已成为工程师的一个潜行高峰。 它将于7月在白天发布,并于2016年秋季在iOS 10的iPhone和iPad App Store上发布。 到目前为止,Swift取得了巨大的成功。超过100,000个应用程序已开始使用Swift在其某些代码上以一种或另一种形式工作,包括Twitter,Uber和Lyft等。

8:“迅速很难将其正确修复,这很好。” 与Fraser Speirs

通过RSS订阅 我很高兴在本集中与Fraser Speirs分享我的谈话。 弗雷泽(Fraser)是苏格兰格林诺克(Greenock)锡达斯卓越学校(Cedars Excellence of School)的中学部主任。 在此之前,他是计算机和IT主管,负责学校的计算机科学教育和IT基础架构。 感谢弗雷泽(Fraser)抽出宝贵的时间进行教学,写博客和播客,以分享他的专业知识和知识。 弗雷泽的博客 校外播客 帆布播客 推特:@fraserspeirs 显示连结 一年的Swift教学 斯威夫特语言 斯威夫特游乐场 学习编码1和2 学习编码3 使用Swift进行应用开发教学 使用Swift课程(老师)和(学生)进入App开发 使用Swift进行应用程序开发-(老师)和(学生) 服务器端Swift Visual Basic Ruby编程语言 蟒蛇 跳房子 每个人都可以用Tynker编写K — 5 代码1入门 代码2入门 美国商业专业人士 Branson Boggia:移动应用程序开发全国冠军Marco Arment(Twitter)和(网站) 布拉德利·钱伯斯(Bradley Chambers)— @bradleychambers Federrico Viticci — @viticci 最喜欢的播客 Ctrl-Walt-Delete 皮质区西翼周刊 打造现代经济的50件事 Freakonomics广播播客 加入Swift Teachers Slack组-brian@swiftteacher.org 关注@_SwiftTeacher 关注@bfoutty 您还可以在我的博客上找到表演说明和其他信息: […]

征服ReactiveSwift:基本体(第2部分)

在征服ReactiveSwift系列的第一部分中,我们分析了命令式方法与功能性反应式方法之间的区别。 在本文中,我们将从ReactiveSwift的各种基元(基本构建块)开始,深入研究ReactiveSwift的领域。 ReactiveSwift的作者将其描述如下: ReactiveSwift提供了可组合的,声明性的和灵活的原语,这些原语是围绕随着时间流逝的价值流这一宏伟概念而构建的。 ReactiveSwift带有许多强大的原语,使您能够以功能性的反应方式编写代码。 学习这些原语的最简单方法是根据它们的角色将它们分为不同的类别。 请参考下图。 正如我们在上一篇文章中讨论的那样,在反应式编程中,我们针对随时间的一系列变化而不是针对特定时间点的状态对系统进行建模。 “ 源 ”类别下的原语负责这些更改的生成和传播。 在该类别下,我们有以下基元: Event,Signal,Signal Producer,Action 。 1.活动 事件表示发生了某些事情。 它是流的基本传输单位。 事件有四种类型: 值:具有有效信息的事件 失败:表示错误的事件 已完成:表示流结束的事件。 此事件后将不再发出其他事件。 中断:表示事件产生被中断。 2.信号 信号是事件的单向流。 可以通过观察员订阅来访问信号的每个事件。 观察信号不会给信号带来任何副作用。 所有事件立即发送给给定信号的所有观察者。 3.信号产生器 顾名思义, SignalProducer是产生信号的东西。 它封装了可以在以后开始的工作(也可以重复)。 换句话说, SignalProducer生产者封装了延迟且可重复的工作。 启动它时,将创建一个新信号,该信号将发出信号,作为调用封装工作的结果。 因此,由于需要启动SignalProducer ,因此据说它很冷,而Signal是温暖的。 4.行动 在延迟和可重复的工作中也使用了动作 。 它封装了SignalProducer的工作。 我们要更好地控制动作而不是信号产生器 。 例如,我们可以通过发送不同的输入值来控制输出。 可以启用或禁用它。 可以通过属性 (如下所述)来被动地控制其状态。 当用输入调用时, 动作将输入和最新状态应用于预定义的工作,并将输出推送给观察者。 5.财产 属性是一个可观察的框,它存储一个值并通知观察者该值的将来更改。 它具有用于生产者和信号的吸气剂,可发出可以观察到的值。 可以使用初始值和Signal , […]