Tag: swift

使用Swift了解哈希表,字典和集合

在帮助iOS开发人员准备技术面试时,我经常讨论哈希表。 由于效率高,哈希表是候选人在应对编码挑战以及实际应用程序时应考虑的出色工具。 在本文中,我们将探讨哈希表的概念,并将其与其他集合类型(例如字典和集合)进行比较。 词典 要了解为什么哈希表很有用,应该熟悉它们的设计。 当被问到时,许多学生都认为“哈希表就是字典”。为验证这一点,让我们回顾一下标准的Swift字典类型: 变种 清单= 字典 ()//添加字典值-恒定时间O(1) list [“ WB”] =“ Wayne Bishop” list [“ FB”] =“弗兰克·霍布斯” list [“ LP”] =“拉里·佩奇(Larry Page) list [“ AE”] =“阿尔伯特·爱因斯坦” //检索密钥 对于 s在list.keys { 打印 (秒) } //获取值 对于 v在list.values { 打印 (v) } //通过键获取值-恒定时间O(1) 让 item = list [“ WB”] //收回“ Wayne Bishop” 词典是处理许多情况的有用类型。 由于键和值都是在运行时提供的,因此可以编写例程来检索单个键,值或它们的混合。 […]

使用Swift处理部分中的可见标题

是否曾经注意到Apple的“照片”应用程序将其标题更改为发粘时变得模糊? 如您所见,一旦页眉到达其粘性位置,背景就会变为模糊。 如果您使用的是Objective-C,那么有使用VlaueForKey的漂亮解决方案 我们需要的是visibleCells属性,但对于visibleHeadersInSection… 快速浏览一下UITableView文档,我们可以得到indexPathsForVisibleRows,并将其与map结合起来可以得到我们需要的数组。 将其附加到scrollViewDidScroll可以得到以下内容: 为了这个例子,我将强制解开可选 让我们看一下实现它的代码: 我们的ColorChangeable协议: 我们的HeaderColorChange 扩展名(用于颜色): 让我们看一下第23行中的iterativeBackgroundChange ,我们首先采用旧颜色(第24行),提取其颜色(包括alpha)(第26行),然后返回相同的颜色,但在其alpha值上添加0.1即可得到我们想要的效果。 我们的DataController: (显然) TableController持有一个DataController类型的实例,以便获取表视图委托和数据源的相关数据。 虚构类型SomeEntity可以是您决定的任何类型,但是,如果它符合ColorChangeable协议(第5行),则意味着此对象在表视图中具有对应的标题,该标题应更改并保存其颜色状态我们所做的。 您可以在此处找到示例项目。 希望你像我一样喜欢它 如果您有任何疑问/评论/启示或任何相关的内容,我很乐意在 Twitter上 或什至在评论部分 与您讨论 。 不要犹豫🙂

SwiftLint最简单的配置

一种基于Swift样式指南的,用于实施Swift样式和约定的工具。 SwiftLint帮助我们在项目中编写了更好的代码,对于我们和团队来说,我们不必担心同一行或下一行中的方括号,查看具有1000行或强制展开变量的控制器。 这篇文章是关于使用自定义规则和cocoapods以最简单的方式将其放入项目中的工具的。 首先… 在Mac中安装homebrew:https://brew.sh /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 2.在终端中安装SwiftLint: brew install swiftlint 3.在您的Podfile中添加SwiftLint: Pod’SwiftLint’ 如果您的项目中没有cocoapods,我强烈建议您签出:https://medium.com/@AyunasCode/how-to-install-cocoapods-52c523f73a63 4.让我们去Xcode! 4.1在打开项目的情况下,转到导航器。 4.2单击您的项目名称。 4.3单击目标,然后转到构建阶段选项卡。 4.4单击+图标 4.5添加脚本阶段: “ $ {PODS_ROOT} / SwiftLint / swiftlint” 5.好的,清理并构建您的项目,然后…屏住呼吸,如果您是人类,您的项目现在会有大量的警告甚至错误(强制展开),但是请耐心等待! Podfile的框架创建了很多这样的内容,在警告和空格之间加上了括号和单词之间的空格。 保持冷静和.swiftlint.yml 该文件将控制规则以及swiftlint框架的透明性,从而解决几乎所有不需要的警告。 还记得Brew安装吗? 我们是本教程的第一步吗? 你需要这个朋友 6.在项目中添加一个名为.swiftlint.yml的新空文件。 如果.swiftlint.yml没有正确缩进,则此命令将不起作用,并且终端将显示所有先前的警告 在框架中进行此更改后,您所需要做的就是在Xcode中构建项目,并修复所有与Swift Style Guide无关的内容。 我希望本文能帮助开发人员加快此配置过程,并帮助您处理编写代码的方式。 将来对您和您的团队都更好!

守护让日志#4

Selam Dostlar, Biraz geciktim胆脂瘤。 Kişiselişlerinyoğunluğundanötürürapo​​ruhazıredemedim。 Gelcte olsa raporsizlerle。😌Gelecek haftalarda sizlere kendimcegüzelbir haberim olacak。 k Ek olarakkişiselbir projemi testadımınataşıdım。 ine Yine gelecekte sizlerlepaylaşıyorolacağım。 Eveeet gelelim raporumuzda yer alacak verimli linklere…😎 İzlediklerim 奥库杜拉姆 iOS:使用Swift处理图像的句 在GreedyGame,我们尝试在不影响Gamer游戏体验的前提下帮助游戏开发者获利。 我们工作… medium.com 构成我的用户界面设计策略的10条原则 用户界面是任何数字产品的重要组成部分。 当界面设计良好时,用户不会注意到…… medium.com 如何使用Swift在iOS中制作渐变 在Swift中进行渐变从未如此简单。 有两种方法可以实现结果。 codeburst.io 图像大,手机小 具有图像的滚动视图在iOS应用程序中无处不在。 图片有助于吸引用户,但可以在小型… media.com 上展示它们 Swift Localhost:使XCUITest再次出色 动机 medium.com Swift文字转语音工具 您是否曾经考虑过将文本转换为语音以供盲人使用的应用程序? AVFoundation框架可以为您提供很多帮助! […]

在iOS中使用Firebase推送通知

应用注册窗口将显示以下步骤 将GoogleService-Info.plist文件下载并移动到您的项目中,然后将firebase / core pod文件安装到您的项目中 添加GoogleService-Info.plist之后,请转到appDelegate.swift。 在didFinishLaunchingWithOptions中添加FirebaseApp.configure() 。 在appDelegate中添加以下代码以从firebase获取通知, 在appDelegate.swift中添加UserNotification功能后,返回Firebase控制台→打开项目→单击Cloud Messaging →发送您的第一条消息

简要介绍:实现MVVM-C模式

您可以阅读它或尝试与我们创建一个简单的pp。 我们建议使用后者。 我们已经发布了有关MVVM模式的文章: MVVM体系结构:分步指南 ViewModel有什么不同。 essays.decode.agency 以及关于使用协调器的一项: 与协调员配合应用流程 向庞大的ViewController告别。 essays.decode.agency 因此,唯一合乎逻辑的下一步就是将两者放在一起,并在一个实际示例中引导您实现MVVM-C模式。 我们将其称为“红色和绿色”应用程序。 基本结构 我们将在语义上将“红色与绿色”应用程序的屏幕分组为单位。 每个单元包括以下组件: 视图 ViewController 视图模型 ViewModelProtocol ViewModelProtocol用于进一步封装ViewController和ViewModel之间的通信。 我们的应用程序有一个主屏幕,可以选择红色或绿色。 选择红色将我们带到红色屏幕,绿色将我们带到绿色屏幕。 每个VC通过两个组件初始化: mainView —定义屏幕的可视部分并在其上配置操作 viewModel —分离UI部件的逻辑; 在MVVM-C模式中,它还负责与协调器进行通信 让我们深入了解并定义主屏幕。 我们将其称为MainVC: 在LoadNibFromEnum中,您会看到我们使用了自定义函数来调用Nibs: 视图是通过相应的XIB定义的,其中有两个按钮,这些按钮在屏幕上显示,因此可以定义对它们的操作。 ViewModelProtocol定义了可以在VC-VM关系上执行的所有动作。 在这种特定情况下,我们只需要在上述两个按钮上定义动作,因此我们将这样做: 可以以多种方式定义动作,但是出于代码易读性的考虑,我们仅通过块定义动作。 ViewModel可以是符合ViewModelProtocol的类或结构,这意味着在ViewModelProtocol中定义的所有方法或动作也必须在ViewModel中定义。 然后,我们最终可以将视图中的按钮动作与ViewModel中定义的动作连接起来: 我们的MainView是公开的,因此我们可以在viewDidLoad中的按钮上定义所有动作,并将每个动作转发到ViewModel中的块。 这样,ViewController不必知道导航接下来会发生什么,并且无需承担控制UI的责任。

核心数据入门

入门应用程序的链接将在此处发布。 现在创建一个新文件并将其设置为数据模型 随意命名并描述模型,如下所示。 我已经按照我构造的UI进行了此操作,但是您可以使用不同的Model描述创建其他UI。 如果您还有其他字段,请继续进行下一步,不要忘记在每个代码段中添加它们。 专家提示:您可以为联系人添加和选择图像。 数据类型应设置为“二进制数据”,并且图像数据应存储在此字段中。 现在,突出显示“实体名称”,转到“数据模型检查器”,将“类”下“代码生成”的属性从“类定义”更改为“手动/无”。 现在,移至Xcode中的“编辑器”选项卡,然后单击“创建NSManagedObjectSubclass”,这将创建两个文件,即:CoreDataClass.swift和CoreDataProperties.swift 将此代码添加到CoreDataClass.swift中: 便利init(第一个:字符串,最后一个:字符串,电子邮件:字符串,电话:Int64,上下文:NSManagedObjectContext){ 如果让ent = NSEntityDescription.entity(forEntityName:“ Contact”,in:context){ self.init(entity:ent,insertInto:上下文) self.firstName =第一 self.lastName =最后 self.emailId =电子邮件 self.contactNumber =电话 }其他{ fatalError(“无法找到实体名称!”) } } 该代码通过通过函数调用设置所有字段来对Core Data Model实例进行初始化。

在Swift中编写轻量标记解析器

这篇文章的完整代码可以在这里找到 。 最近,我不得不编写一个轻量级的标记解析器,以在我们的iOS应用程序中提供文本格式。 要求与您在其他富通讯应用程序中可以找到的要求类似: 为了强调单词或句子,用户可以用*号包围文本以创建粗体文本,或用_underscores_表示斜体文本。 要在消息中显示更正,用户可以用〜波浪号〜包围文本以删除文本。 用户可以组合格式选项。 因此,以下文本: 那个*快速*,〜红褐色的狐狸跳过了_ *懒狗* _。 应采用以下格式: 敏捷的棕狐狸跳过了一条懒狗 。 另一个附加要求是字内格式化不应该被允许。 例如,以下文本: 计算_6 * 4 * 8_。 _Quick_zephyrs_blow_。 应采用以下格式: 计算6 * 4 * 8 。 Quick_zephyrs_blow 。 我考虑了实现解析器的几种方法,包括Parser Combinators ,但是最后,我决定从头开始编写它。 这样做可以让我完全控制性能。 我们可以将标记文本格式分解为以下步骤: 令牌化,这是将输入字符串分解为令牌(格式定界符和文本)的过程。 解析 ,这是解释标记以生成格式化文本的抽象表示的过程。 渲染 ,包括将抽象表示形式转换为NSAttributedString 。 让我们详细了解实现每个步骤的细节。 实施分词器 我们的标记格式具有三种不同的标记: text , left delimiter和right delimiter 。 每个令牌应携带上下文信息,例如定界符或实际文本。 让我们创建一个enum来建模: 枚举MarkupToken { […]

设置Clean Swift模式有助于编写单元测试

您是否知道这些时刻可以启动应用程序,说服自己需要通过编写尽可能多的单元测试来证明质量? 在那之前,您发现几乎不可能或花费大量时间编写适当的单元测试。 好了,我有了这些时刻,并开始意识到,您的应用程序中的良好模式有助于编写单元测试。 好的模式是第一位的 为了编写更好的单元测试,您需要一个一致的模式。 如果您想编写更好的单元测试,那么MVC模式绝对不是最佳模式。 大多数情况下,您会得到一个非常大的ViewController ,其中包含各种工作:Massive View Controller。 在良好的模式下,每个组件都充当独立于任何其他组件的黑匣子。 黑匣子里面发生了什么,您不知道也不在乎。 但是这些黑匣子应具有定义明确的输入和输出。 在一致的结构中,应该更容易识别组件,测试主题,输入和输出。 代码独立性是通过在Swift中使用协议来实现的。 通过使用协议,一个组件不会直接拥有另一个组件,而是通过协议间接引用了该组件。 这样,这两个组件不会互相了解,但是都依赖于相同的协议。 在将数据从一个组件发送到另一个组件时,模型结构可以在Swift中提供数据独立性。 通过为数据请求,数据响应和视图模型创建单独的模型,可以避免在更改一个模型时还必须更改将模型用作输入或输出的对象以外的组件。 这也适用于他们的测试,这使这些测试不那么脆弱。 我遇到的一个不错的模式是使用VIP循环的Clean-Swift 。 在这种模式下,一切都会通过一个VIP循环朝一个方向前进。 它从ViewController开始,到Interactor ,再到Presenter ,最后回到ViewController 。 两个组件通过包含输出和输入逻辑的协议相互通信。 ViewController处理显示逻辑, Interactor业务逻辑和Presenter表示逻辑。 对于单元测试,这意味着您可以在每个边界上测试所有协议方法,因此它将完全覆盖所有组件。 哪里去了? 开始时,可​​能不清楚在代码中的什么位置。 为了更好地理解我们所追求的模式的实现,我将举一个例子。 在此示例中,我在UITableViewController中显示电影标题及其发行年份的列表。 电影的模型如下所示: 结构电影{ 让标题:字符串 让releaseDate:字符串 } 首先,我创建一个具有Interactable- , Presentable-和Displayable协议的ListMoviesViewController , ListMoviesInteractor和ListMoviesPresenter 。 如果您开始编写应用程序代码,则最简单的方法是先从ViewController , Interactor和Presenter开始 。 开始编写单元测试时,最简单的方法是从Interactor , Presenter和ViewController开始 。 在VIP模式中, […]

iOS:使用Firebase发送推送通知

我目前正在学习【Swift 4】以扩展我的编程知识。 几年前,我看过Swift,但现在准备好深入研究它。 我已经使用Java编程多年,并且对Python有所了解。 因此,我学习一种新语言的方法受到该先前知识的影响。 ☞步骤1:在XCode上创建一个空项目 一种。 选择“ 单一视图应用” b。 确保您提供唯一的软件包名称。 C。 启用功能远程通知和推送通知 单击.xcodeproj->功能->启用推送通知 ☞步骤2:使用Pod安装要求 Firebase和FirebaseMessaging等要求。 在安装之前,请确保您的机器已安装Cocoapods。 如果未安装,请不要担心,可以从这里轻松安装。 // open terminal and run below command $ cd /your-project-directory/ //使用此命令初始化pods $ pod init 发布此命令Podfile将在项目根目录中创建//使用vi或vim编辑器(无论您的计算机上安装了什么) $ vim Podfile //继续安装添加的Pod $ pod安装 ☞步骤3:设置Firebase帐户 一种。 从这里创建项目 b。 从Firebase控制台输入创建的项目。 选择应用程序环境,Android / iOS / Web。 确保您的软件包名称(或bundleId)与设置XCode应用程序时输入的名称相同。 C。 将配置文件(通过上述过程生成)添加到项目根目录: GoogleService-Info.plist ☞步骤4:在Apple帐户中设置证书 一种。 […]