Tag: Swift 4

Swift — 4 —核心数据—第6部分,将NSFetchResultController与UITableView一起使用

如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946 您好,希望您一切都好。 在这一部分中,我们将讨论NSFetchResultController( NSFRC )。 我建议您也阅读之前有关核心数据的教程: 基本 简单的应用程序 核心数据单例 使用核心数据进行单元测试 核心数据迁移 NSFetchResultController 当需要获取 , 插入 , 更新和删除核心数据并且需要更新用户界面(如UITableView和UICollectionView)时,可以使用NSFetchResultController。 每次在托管对象上下文中对托管对象模型执行插入,更新或删除操作时, NSFRC都会提供委托回调 。 NSFRC提供了performFetch()方法,该方法返回NSManagedObject模型的数组。 这个NSManagedObject模型数组与UITableViewDelegate和UITableViewDataSource方法作为提要数组一起很好地工作。 NSFRC仅适用于核心数据。 请从这里下载启动项目 请输入☕和开始代码– FetchResultController的基本初始化包含以下步骤: NSManagedObjectContext —一个管理对象上下文,NSManagedObjectContext NSFetchRequest —提取请求,其中包含有关要从核心数据存储中提取哪个实体的信息。 NSSortDescriptor —用于按升序或降序排列结果的排序描述符。 在表视图部分中显示的可选部分名称 。 缓存名称 ,如果您有一个只读数据集,则NSFetchResultController会在第一时间从存储中读取/读取数据。 下一次提取将使用缓存自动获取数据。 显然是一个NSFetchedResultsController类。 一个负责获取诸如插入,更新,删除之类的核心数据操作的回调的委托 。 初始化 请牢记所有这些要点,以便打开入门项目并在CoreDataManager类中的代码下面复制粘贴: 懒惰的var fetchedResultsController:NSFetchedResultsController = { //初始化提取请求 让appDelegate = UIApplication.shared.delegate为! AppDelegate […]

Swift 4 Introduction系列1.5 — Swift数据类型元组

通过将2个或多个基本数据类型分组为单个复合数据类型来形成元组。 元组的每个元素可以是任何Swift基本数据类型。 元组中的每个元素之间的数据类型可以不同。 由于元组可以包含许多不同的类型,因此我们可以从任何类型的排列中创建元组。 元组不适合复杂和持久的数据结构。 对于复杂而持久的数据结构,我们应该使用结构或对象类。 要创建一个常量元组,我们使用相同的关键字let,然后使用关键字var来创建变量元组。 常量和变量的行为与Swift基本数据类型相同。 常量是不可变的,变量是可变的。 我们可以用字符串和整数组成一个元组,如下所示: 让contact =(“我的名字”,22341176) 要访问元组中的元素,我们使用从0开始的索引。 例: 0 接触1 像往常一样,我们也可以通过先声明一个元组来创建一个元组。 我们只需要将所有不同的数据类型放在方括号中即可,并用逗号将它们分开。 例: 让address1 :(字符串,字符串) address1.0 =“ A座公寓” address1.1 =“新泽西州” 地址1.0 地址1.1 请注意,尽管我们可以先声明常量而不分配数据。 这不是最佳实践。 为了声明常量,我们应该在同一条语句中声明并分配它们。 这是为了使我们的代码更安全。 我们只应声明元组,然后在绝对必要时分配数据。 对于变量,即使我们没有要输入的数据,也应首先声明和初始化变量。 创建元组变量的首选方法是使用以下方法同时创建和初始化变量。 var contact1 =(String(),Int()) contact1.0 contact1.1 contact1.0 =“这是一个测试” contact1.1 = 2132 contact1.0 contact1.1 contact1.0 =“大卫” contact1.1 = 76788779 contact1.0 contact1.1 对于元组中的每个元素,我们可以具有相同的数据类型。 […]

iOS中具有通用数据模型的自定义可重用数据源。

UITableView和UICollectionView是用于在任何类型的iOS应用程序中呈现数据的两个常见UI组件。但是将这些大数据呈现到单元中并不是什么大问题,主要的问题是我们如何处理这些数据。 让我们以UITableView为例,通常通过在viewController中采用UITableviewDatasource协议一致性,我们可以使用它的一些专用方法来处理tableview内部的数据呈现。 这是简单的代码片段示例 上面的例子非常简单,我们只是为viewController创建了一个扩展,并添加了所有tableview数据源方法。 它是如此的好和简单,但是为什么我应该使用Custom数据源呢? 好的 !!!! 当必须在其他视图控制器中显示这些相同的数据块时,您将怎么办。 没什么大不了的,我也将在其他视图控制器中创建相同的东西。 创建自定义可重用数据源可以处理整个应用程序中的所有数据源逻辑和数据模型渲染部分。我在整个应用程序中都说了。是的,但是不同控制器的数据模型不同,所以我将自定义数据源设置为一个通用模型类型,因此只需使用您的数据模型实例化此自定义数据源,以下是代码段。 在这里,我采用了模型(用于数据模型渲染),reuseIdentifier(用于使TableView单元格标识符出列)和CellConfigurator(它是一个元组,它同时容纳Data模型和UITableviewCell,其工作方式类似于tableview单元格中用于索引处行的闭包)作为参数以上课程。 我还在此类的扩展内部创建了一个静态方法来管理特定的数据模型。您还可以根据需要创建自己的模型。代码段。 扩展TableViewCustomDataSource,其中模型== ItemsDetailsLists {静态函数displayData(用于itemLists:[ItemsDetailsLists],withCellidentifier复用标识符:字符串)-> TableViewCustomDataSource {返回TableViewCustomDataSource(模型:itemLists,reuseIdentifier:reuseIdentifier,cellConfigurator:{(数据,单元格)入口itemcell: ItemListsTableViewCell =单元格为!ItemListsTableViewCellitemcell.setupParameters(itemlist:data)})}} 在您的viewController内部只需创建一个像这样的属性 私人var dataSource:TableViewCustomDataSource ? 这里的ItemDetailsLists是我的数据模型,一旦获得响应,就可以像这样设置您的customdatsouce属性,并将tableViewdataSouce设置为customdatasource。 func renderTableViewdataSource(_ itemlists:[ItemsDetailsLists]){dataSource = .displayData(用于:itemlists,带有Cellidentifier:“ ItemListsTableViewCell”)self.itemListTableview.dataSource = dataSourceself.itemListTableview.reloadData()} 这是完整的源代码Github链接 欲了解更多博客,请点击此链接 参考文献: *重构视图控制器,作者Paul Hudson Swift中可重用的数据源 通过约翰·桑德尔 Shakti Prakash在about.me 我是印度班加罗尔的软件工程师。 查看我的仓库。 关于我

Swift 4.2的新增功能

Swift 4.2是4.1和4.0的主要更新。 该更新主要与改进,代码优化和运行时性能增强有关。 现在,您可以使用Xcode 10.0构建用Swift 4或Swift 3编写的目标。在本文中,我将讨论Swift 4.2中引入的新功能。 让我们一一解决。 取消ImplicitlyUnwrappedOptional (IUO)类型ImplicitlyUnwrappedOptional (IUO) -0054 该建议引入了从Swift中移除ImplicitlyUnwrappedOptional类型,并在声明IUO attribute其替换为IUO attribute 。 您仍将继续使用语法T! 。 但是,使用! 在属性或变量声明的类型末尾,不再表明该声明具有IUO类型。 相反,它表示两件事: 声明具有可选类型。 该声明具有指示其值可能被隐式强制的属性。 (没有人会写或观察该属性,但我们将其称为@_autounwrapped 。)此后,此声明称为IUO声明。 以下是一些示例: // f:()-> Int ?,具有IUO属性 func f()->整数! { 返回 3 } //成功; x1:整数? = 3 令 x1 = f() //成功; x2:整数? = .some(3) 让 x2:诠释? = f() //成功; x3:整数? […]

使用Google Cloud Build的Vapor 3的简单CD流水线— git push→Docker容器→GKE中可用的服务

我有一个用Swift 4.1编写的Vapor 3项目,我想创建一个简单的CD管道,以便在每次git push送到分支时(或当有新标签时),都将在Google Kubernetes Engine中构建并部署一个容器,其API可从http://[INGRESS_IP]/projectname/获得,GKE中已配置了一个群集,该群集已配置Istio 1.0作为服务网格和定义的路由。 Vapor 3 Web框架 您可以在https://vapor.codes/上查看有关Vapor 3的更多信息,以及在https://docs.vapor.codes/3.0/上提供的文档。 这里特别令人感兴趣的是Swift 4.1与高性能Apple NIO非阻塞框架的结合。 如果要利用并行计算,多核体系结构和事件驱动的设计模式,则可能希望为项目采用非阻塞体系结构。 Vapor 3还带有一个异步库。 您可以使用的越多,并行化就越多。 云构建 Google Cloud Build是启用CD管道的简单工具; 在触发器方面,它支持推送到git分支和标签(与Google自己的代码仓库,GitHub和Bitbucket的Cloud Source Repository集成)。 已经有很多可用的云构建器可以作为单个步骤添加到管道中( 例如 ,docker,mvn,go,kubectl等)。 创建Dockerfile 配置Kubernetes部署和服务 配置Istio网关和虚拟服务 在cloudbuild.yaml配置管道 在Google Cloud Build中定义构建触发器( 例如,推送,标记) 1.创建Dockerfile 我使用了两个阶段的多阶段Dockerfile: 在Swift 4.1容器映像上构建Vapor 3服务 编译后的文件将复制到干净的生产映像中,从而生成一个小容器。 此示例使用ubuntu:16.04但有些人也使用alpine,显然有一些好处。 我没有尝试过alpine版本,如果它对您有用,请分享您的配置文件和/或评论 #Builder图像-构建代码 #================================================== ============== 来自swift:4.1作为构建者 运行apt-get -qq更新&& rm -r / var […]

在Swift-4中玩闭包(Part -2)

大家好 !! 在上一篇文章中,我们都讨论了Swift中的一些基本闭包。如果您尚未对其进行检查,请进行检查。在本教程中,我们将讨论更多内容。 Swift会自动为内联闭包提供简写参数名称,可用于通过名称$ 0,$ 1,$ 2等来引用闭包参数的值。 速记参数名称 正如我们上面讨论的,Swift 4通过表示$ 0,$ 1,$ 2-$ n来方便用户将内联闭包表示为速记参数名。通过在闭包表达式中使用此速记参数名,我们可以从其定义中省略闭包的参数列表。 in 关键字 由于闭包表达式完全由其主体组成,因此可以省略。请看以下示例。 因此,在第一个示例中创建了一个闭包,该闭包采用单个参数并返回字符串。此处$ 0表示第一个参数。类似地,在第二个示例中,闭包采用两个参数,通过使用$ 1,我们引用了第二个参数。关闭 自动关闭 我们知道闭包可以用作函数中的参数。当我们编写@autoclosure时 ,参数会自动包裹在闭包中。但是,如果我们创建一个具有@autoclosure的函数,则存在一个问题,通常调用该函数具有自动关闭功能的函数,但是实现这种功能并不常见。 让我们举一个小例子。 func simpleFunctionwithoutAutoclosure(_ parameters:()-> Void){ 打印(“嘿,我们刚刚创建了一个没有@autoclosure属性的函数”) 参数() } simpleFunctionwithoutAutoclosure({ 打印(“ hello”) }) func simpleFunctionwithAutoclosure(_参数:@autoclosure()->无效){ 打印(“嘿,我们刚刚创建了一个具有@autoclosure属性的函数”) 参数() } simpleFunctionwithAutoclosure(print(“ hii”)) 并且输出如下 从上面的两个函数中,我们注意到,在@autoclosure的情况下,无需将表达式用大括号括起来。 如果要传递闭包而不是自动闭包,这就是我们需要做的。 逃逸关闭 当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义,但是在函数返回后会被调用。 声明将闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许对闭包进行转义。 Apple的文档给出了一个示例,该示例将传递给函数的闭包附加到您的类/结构中可变的闭包数组中: varcompleteHandlers:[()->无效] = [] func someFunctionWithEscapingClosure(completionHandler:@escaping()-> Void){ […]

iOS应用程序中的推送通知

+ Shubaham Jain 对于iOS应用,您可以通过以下两种方式实施Firebase Cloud Messaging: 通过Firebase Cloud Messaging APNs界面接收最大4KB的基本推送通知消息。 在前台应用程序中向上游发送消息和/或接收高达4KB的下游数据有效载荷。 将Firebase添加到您的iOS项目 对于iOS客户端应用程序,您可以通过两种互补的方式实施Firebase Cloud Messaging: 通过Firebase Cloud Messaging APNs界面接收最大4KB的基本推送消息。 在前台应用程序中向上游发送消息和/或接收高达4KB的下游数据有效载荷。 将Firebase添加到您的iOS项目 先决条件 在开始之前,您需要在环境中进行一些设置: Xcode 8.0或更高版本 针对iOS 8或更高版本的Xcode项目 Swift项目必须使用Swift 3.0或更高版本 您的应用程序的捆绑标识符 CocoaPods 1.2.0或更高版本 对于云消息传递: 物理iOS设备 您的Apple Developer帐户的Apple Push Notification身份验证密钥 在Xcode中,在“ 应用”>“功能”中启用“推送通知” 在Mac机器上安装Cocoapods的步骤: 步骤1:如果您的计算机上未安装cocoapods,请首先在终端sudo gem install cocoapods上使用以下命令将其安装在计算机上 步骤2:将汇出至 导出PATH = $ PATH:/ Library / Ruby / bin […]

苹果商务聊天

Merhabalar,BuyazıdaWWDC 2017’detanıtılan商业聊天’tenbahsedeceğim。 商务聊天özelliğiniaslındauzunzamandırWhatsApp’tan bekliyorduk。 Ancak ilk olarak 2015 F8’de Facebook Messenger,现在已经可以使用。 Apple bu konularda hep biraz temkinli ve bu tarzgeliştirmelerisonradan getirmeyi tercih ediyor。 苹果商务聊天软件在市场上销售: Öncelikle商务聊天BE和一个BETA olarakaçılmışdurumda。 Ben de buyazıdailk olarak BETAsürümkurulumundan venasılgeliştirmeyapacağımızdanbahsedeceğim。 andu anda儿子发布edilmişiOSsürümü-11.2.6- oyüzdenilk olarak儿子betasürümüolan -11.3 BETA 3-sürümünükurmamızgerekli。 苹果酱β-内酯 基西米 成分肾上腺素gidip oradansertifikamızıcihazayüklüyoruzveardındanAyarlar’dan telefonungüncellemesiniyapıyorüüüüüüüüü11.m BETA 3 s。 Ardındanbeta版本Xcode 9 beta 3版本已通过indirmemiz gerekiyor。 Xcode 9.3 beta […]

Swift 4中的抽象工厂模式

Abstract Factory提供了一个用于创建相关或相关对象族的接口,而无需指定其具体类。 工厂可以生产不同类型的产品。 抽象工厂创建不同类型的工厂。 类型:创作模式 也称为:套件 结构体: 参加者: AbstractFactory:声明用于创建抽象产品对象的操作的接口。 ConcreteFactory:实现创建具体产品对象的操作。 AbstractProduct:声明一种产品对象的接口。 ConcreteProduct:定义要由相应的混凝土工厂创建的产品对象。 补充AbstractProduct接口。 客户端:仅使用AbstractFactory和AbstractProduct类声明的接口。 Swift 4实现: 这是《四人帮》一书中给出的示例WidgetFatory的实现。 我不会详细描述以下代码片段。 我假设您已经具有抽象工厂设计模式的先验知识。 根据类图,有两种抽象产品… 对于一个抽象产品,将有混凝土产品,而有两个混凝土工厂。 抽象工厂: 根据分类图,有两个混凝土工厂。 在这里,我们的客户是GUIBuilder.swift 。 根据抽象工厂模式,客户将仅使用抽象工厂和产品类。 客户不必担心它从抽象工厂得到的具体产品。 客户用途: 您可以在此处找到完整的源代码:Github

MVVM-1:一般性讨论

哦,我的……我们今天所拥有的……另一个关于MVVM的博客。 有什么新鲜事,否则它会讲同样无聊的事情。 是的,那么一件事是,我们的旅程将是漫长而冒险的,并且会围绕MVVM公园进行详细的游览。 我们不仅会学习基础知识,甚至还会尝试使用复杂UI的实时应用程序场景。 让我们继续进行MVVM冒险.. !!!! 听起来有点有趣;)。 是不是 MVVM或模型—视图— ViewModel是一种设计模式,旨在模块化您的代码并将其构建在测试驱动开发环境中。 当苹果公司的传统MVC设计模式使我们的控制器笨重且单元测试痛苦时,诸如MVVM,VIPER,MVP等不同的设计模式便应运而生。 MVVM非常方便,因为它在所有组件之间提供了松散耦合的机制,将您的视图,业务和数据逻辑隔离开来。 有很多教程和博客对此进行了解释,但是在这里,我们将遵循MVVM的基本规则,并学习如何尊重它们并编写漂亮的代码。 我们将分两部分讨论MVVM: 第-1部分讨论了有关MVVM和小型演示代码的大量讨论。 第2部分 将通过一个复杂的UI示例来处理MVVM中一些常见的漏洞,以及解决这些漏洞的方法。 你会学到什么? 我们将在示例的第-1部分中学习以下内容 什么是MVVM? 为什么选择MVVM? 我们将构建一个示例示例。 MVVM的一些缺点。 什么是MVVM? 模型: 模型基本上是应用程序具有的数据模型或实体。 它们只是具有简单关联属性的结构或类。 通常,它们只是保存从原始数据结构映射的数据,这些数据可能来自您的API或其他来源(例如SQLite文件等)。 查看或查看控制器: 视图是显示的视觉元素。 应用程序屏幕上的所有UI组件都是视图。 该视图仅包含UI逻辑,例如数据渲染,导航等。 该视图拥有视图模型。 查看模型: 视图模型接收UI事件并执行业务逻辑,并提供要在UI上显示的输出。 这是负责处理驱动视图的业务逻辑的组件。 但是它在内部不会修改UI,也没有对视图的引用。 它拥有数据模型。 为什么选择MVVM? 好的,我们当中有些人可能会问,当苹果公司提供了美观且更简单的MVC时,为什么还要使用MVVM。 我们可以集成一些不同的设计架构,例如Facade,Coordinator,Singleton等,以构建模块化代码。 好的,现在有以下三个原因使MVVM脱颖而出: 隔离代码:隔离代码 。 基于MVVM组件将特定的视图处理划分为跨视图,模型和视图模型的部分,从而为我们提供了模块化的代码结构。 避免使用笨拙的控制器:使用MVC的开发人员知道,当我们的应用程序可扩展且需求不断与我们现有的逻辑混乱时,我们的控制器将继续扩展,直到并且除非将控制器代码路由到单独的文件中。 通过MVVM,我们在视图模型中写下了业务逻辑,仅将输出传递给视图或控制器。 测试驱动开发 : 最重要的是,MVVM确实提供了执行TDD的良好平台。 我们可以写下用于视图模型的单元测试用例,并测试驱动UI的业务逻辑。 单元测试用例在开发时确实非常重要,因为它们在很大程度上减少了我们的破码机会。 请点击以下链接在iOS中探索有关TDD的更多信息 iOS中的测试驱动开发,SWIFT 4-第1部分 […]