Tag: swift

带有MVC的iOS Tableview

如何使其清晰并享受您的代码 如果您构建iOS项目,您已经知道这个事实:最常用的组件之一是UITableView 。 如果您尚未构建任何项目,您仍然可以在许多流行的iOS应用中看到UITableView :YouTube,Facebook,Twitter,Medium,大多数Messenger应用等。基本上,每次需要显示动态数量的在同一视图上的数据对象,请使用UITableView 。 另一个基本组件是CollectionView,我个人更喜欢使用它,因为它更灵活。 稍后我将发表另一篇有关CollectionView的文章。 因此,您想将UITableView添加到您的项目。 一种明显的方法是使用具有内置UITableView的UITableViewController 。 它可以通过简单的设置工作,您只需要添加数据数组并创建一个单元格即可。 它看起来很简单,并且可以按照我们需要的方式工作,除了以下几点: UITableViewController代码变得超长。 并且它打破了MVC模式。 什么是MVC?为什么我们需要考虑一下? 您可以查看这篇文章,其中对所有iOS体系结构模式都有很好的解释。 您不想处理所有这些模式吗? 无论如何,您可能仍想拆分您的一千行长的UITableViewController。 在上一篇文章中,我描述了将数据从模型传递到控制器的三种方法。 在本文中,我将使用委派方法向您介绍处理tableViews的方法。 这种方法使代码看起来非常整洁,模块化且可重用。 我们将不使用一个UITableViewController ,而是将其拆分为多个类: DRHTableViewController :我们将其设为 UIViewController的子类,并添加UITableView作为子视图 DRHTableViewCell : UITableViewCell的子类 DRHTableViewDataModel :它将使用委托进行API调用,创建数据并将数据返回给DRHTableViewController DRHTableViewDataModelModelItem :一个简单的类,将保存所有数据,这些数据将显示在DRHTableViewCell中 。 让我们从UITableViewCell开始。 第1部分:TableViewCell 从一个名为“单视图应用程序”的新项目开始,并删除默认的ViewController.swift和Main.storyboard文件。 我们将逐步创建所有需要的文件。 首先,创建一个UITableViewCell子类。 如果要使用XIB ,请选中“也创建XIB文件”。 在此示例中,我们将复制中型主页的简化版本。 因此,我们将需要添加以下子视图: 头像图片 名称标签 日期标签 文章标题 文章预览 以所需的方式应用“自动布局”,因为单元格设计不会影响我们在本教程中所做的任何事情。 为每个子视图创建一个出口。 在您的DRHTableViewCell.swift中,您将具有类似以下内容: 类DRHTableViewCell:UITableViewCell { @IBOutlet弱var […]

Swift用Swift编写的AST。 ∞的第2部分

在上一部分中,我确实为Swift语言构建了基本的顶级AST。 还没什么壮观的。 只是一些枚举和严格的数据建模。 今天,我将更深入地研究并复制Swift语法的Declaration部分。 让我们看一下: 它看起来与语句完全相同,因此让我们为其编写类似的枚举样式类型并集。 枚举声明{ 案例`import`(ImportDeclaration) 大小写常量(ConstantDeclaration) 大小写变量(VariableDeclaration) case`typealias`(TypealiasDeclaration) 案例函数(FunctionDeclaration) 案例enum(EnumDeclaration) case`struct`(StructDeclaration) 案例`class`(ClassDeclaration) 案例`protocol`(ProtocolDeclaration) 大小写初始值设定项(InitializerDeclaration) 案例deinitializer(DeinitializerDeclaration) case`extension`(ExtensionDeclaration) case`subscript`(SubscriptDeclaration) case`operator`(OperatorDeclaration) 大小写PriorityGroup(PrecedenceGroupDeclaration) } 有意地错过了一种语法定义。 哪一个? declarations -> …实际上从未在语法中使用。 因此,我们不需要它。 进口 导入语法是我们的​​第一个非平凡语法。 它看起来并不那么简单。 主要是因为隐藏的功能不是导入整个模块而是从中导入单个定义。 这是语法: 第一行告诉我们,导入语句由可选属性列表,关键字,可选种类说明符和路径组成。 这次我们不能import-declaration建模为union类型。 我们需要每种类型的单个值来形成正确的类型实例。 这种情况通常称为类型产品。 在Swift中,我们可以通过几种方式对产品进行建模: 元组。 这确实是临时类型的产品。 易于编写,难以支持。 我发现Xcode IDE中缺少元组支持,因此我们将寻找其他选择。 类。 用多种OOP语言对产品进行建模的方式。 类的问题(继承性,行为和可变性)使我们几乎无法使用此选项。 结构。 好的旧结构/记录。 简单而强大的建模产品的方法。 非常适合我们的情况。 构造该语法的哪个模型将如下所示: struct ImportDeclaration { […]

Controls de Acesso-迅捷3

Swift 3 nos trouxe almumasmutançasde controle de acesso interessantes。 随着开放的不同,公共的,内部的,私人的,私人的,私人的,天真的,不可思议的礼节。 费利斯曼特(Felizmente)像新星一样简单。 佩剑(Squiber)军刀: São5níveisde acesso Excessem cinconíveisde acesso que controlam,a partir de qual arquivo de origem oumódulovocêpod pod acessar alguma coisa。 Abaixo segue uma brevedescriçãode cadanível: 开放的:准公开资格的公开资格等级,合格的成员资格 (。swift)没有法定资格或法定资格。 在“ 子类别”或“ 子类别 ”中覆盖 “公开” 类别,在 “公开” 类别中不 公开或不公开类别中的任何类别。 公众人士: Permite que mesmo acesso que是“ open”, qualquer arquivo […]

Swift 4.2的新功能-我的摘要

星期三。 六月06,2018 我刚刚看过WWDC 2018的Swift新增功能,我认为写一篇关于此演讲的博客文章并总结我的学识是一个很大的动力。 这是我真正喜欢的一些Swift 4.2新功能。 希望您会喜欢! 🤓 SE-0194枚举案例的派生集合 如果需要打印所有可用的枚举值,则必须创建一个包含所有枚举大小写的辅助变量。 例如,一个名为allCases的静态数组。 这种方法的一大缺点是,每次修改枚举allCases时,我们都需要记住要更新allCases数组。 Swift 4.1的方法: 在Swift 4.2中,我们可以使用CaseIterable协议来为我们完成所有工作! 请看下面的例子: 条件符合 它也将与Optional和Dictionary类型一起使用。 条件一致性与Hashable , Encodable和Decodable协议的工作方式相同。 例如,因为Int是Hashable ,那么在这种情况下,这意味着Int? 也是可Hashable ,因此[Int?]也可Hashable ! 布尔切换 很小,但我认为-非常好的功能。 在阅读objc.io博客文章时,我第一次遇到该扩展程序。 现在它已内置到Swift 4.2中。 🎉 哈希协议 protocol Hashable { func hash(into hasher: inout Hasher) } 在Swift 4.2中,我们不必为hashValue提供自定义算法。 现在,swift可以处理具有运行性能的哈希方法质量。 重要的是, hashValue使用在每个应用程序启动时创建的随机的每个进程的种子。 In️在这种方法中,您应该将与hashValue相关的代码更改为常量。 在每次运行的应用程序中,哈希值都将不同。 ⚠️ SE-0202随机统一 Swift 4.1的方法: 但是在Swift […]

在JSON API中处理传入数据

我被问到的常见问题之一是如何处理来自移动或Web应用程序的不同格式的请求。 可以为JSON API提交数据的三种主要方式: 通过URL传递的数据(即http://www.example.com/api/v1/stuff?var1=myName) 作为POST请求中的表单参数 作为JSON提交的POST,PATCH或PUT请求的主体。 因此,我将从“完美应用程序模板”的一个简单实例开始: $ git clone https://github.com/PerfectlySoft/PerfectAppTemplate.git jsontest $ cd jsontest $ swift包generate-xcodeproj 这将创建一个Xcode项目…打开它,然后打开“ Sources-> Perfect-App-Template-> configuration-> Routes.swift” 在第29行,有一条GET请求的路由,URI为“ /” 如果我们现在按原样运行此项目,则它将构建应用程序并运行它。 要运行:从“方案”下拉列表中选择可执行目标,然后运行(CMD-R)。 然后,在浏览器中访问http:// localhost:8181-您将看到“ Hello,World!” JSON路由和Postman测试 尽管我们可以使用浏览器轻松测试GET路由,但对于其他请求类型(如POST)却并非如此简单。 这是诸如Postman之类的工具介入的地方-这使我们能够通过各种选项模拟不同类型的请求。 JSON GET路线 我们需要添加的两件事是路由,以及该路由的处理程序。 路线: route.append([[“ method”:“ get”,“ uri”:“ / api / v1 / test”,“ handler”:Handlers.JSONtestGET]) 这指向新的路由Handlers.JSONtestGET ,我们需要创建它: 静态函数JSONtestGET(data:[String:Any])抛出-> RequestHandler { 返回{ 请求,回应 做{ […]

如何使您的存储库自述文件看起来不错!

存储库自述文件对我总是很满意。 它们都有不同的风格,包括图像,GIF,徽章,链接等。它们不仅可以看上去,而且可以传达有关该项目进行中的大量信息,并且可以吸引人们的注意力。 可悲的是,我们大多数人,至少在项目开始时,没有浪费时间使我们的回购自述文件大放异彩。 今天,我将向大家展示适合您的回购交易的简便程度,使其看起来比以往更加专业。 免责声明:**这 如果圣诞节和新年前夕之间的一周内上线,则发布。 因此,尽管我可以做一些需要更少时间的事情,但仍然很重要。 继续阅读以了解如何使您的仓库回升。 在..之前很伤心.. =( 您可以在屏幕快照中看到我的Marvels App博客文章存储库的外观。 没有真正的吸引力。 对我而言,这仅是在提醒人们机会不足。 分享有关我的项目和目标的更多信息的机会。 **如果您尚未查看marvel的应用博客文章系列,则可以在这里进行。 您会发现许多有趣的内容,内容涉及如何使用许多不同的pod和工具从头开始创建应用程序,从而使您的生活更轻松。 给我看看更好的.. !! 本自述文件中有几件事正在进行,因此让我介绍一下: 现在它具有徽章,在顶部显示相关信息 它具有锚点导航,允许读者跳至特定部分。 它有一个屏幕截图,显示了应用程序流程以及用户对项目的期望。 它有一个动机部分,回答一些问题,例如: 这是什么? 我为什么要在乎呢? 它与他人有何不同? 这个存储库的目标是什么 ? 它具有发布链接,将链接带到页面。 它具有安装和测试部分,提供有关如何运行这些步骤的说明。 最后但并非最不重要的一个许可证部分,显示代码的可用性 。 这可以像您认为的那样广泛。 您可以使用一些您喜欢的开源项目作为自己存储库的灵感源。 *您可以在这里查看 github上的页面。 自述文件的资源.. 在下面,您可以找到一些资源,这些资源可以在上面提到的仓库转换过程中提供帮助。 去看一下! shields.io是一个了不起的工具。 它允许您粘贴存储库URL,并可以根据您的回购文件推荐徽章。 Shields.io:开源项目的质量元数据徽章 我们提供快速且可扩展的信息图像,作为GitHub,Travis CI,Jenkins,WordPress等的徽章。 Codecov和工作服可以将您的代码覆盖率百分比显示为自定义徽章。 太棒了!! 连续代码覆盖率 连续代码覆盖率。 托管覆盖率报告与GitHub,Bitbucket和GitLab高度集成。 浏览器… codecov.io 工作服 修改说明 coveralls.zendesk.com […]

iOS Swift项目的内存泄漏集成测试

ARC在iOS编程世界中有很大帮助,但是像Java中的GC一样,它不能解决保留周期的问题。 GC在运行时工作,可以检测到保留周期,而无需引用该过程的“根”对象,然后销毁它。 但是ARC正在编译时间,因此它不能这样做。 即使您的泄漏对象很小,并且不会占用太多内存,但是如果它们保留在内存中并可能对应用程序造成奇怪的行为,您仍然需要小心。 在本文中,我将解释一种简单的方法来为iOS swift项目中的内存泄漏添加集成测试。 我还将讲述我面临的问题 添加内存泄漏集成测试以及解决方法。 请在此处下载启动项目:https://github.com/bigbangvn/MemoryLeakIntegationCheck/blob/master/LeakIntegrationCheck_StartProject.zip 尝试运行该应用程序,然后运行测试“ LeakIntegrationCheckTests”。 它现在将失败,但是我们将要修复。 这个例子很简单。 我们只有一个登录屏幕和一个主屏幕。 我们想测试一下是否存在内存泄漏,在用户登录到主屏幕后,执行一些请求并注销。 首先,对于纯swift对象,没有任何麻烦,我们需要添加代码来跟踪实例数。 避免测试代码影响生产。 我们将使用一个标志。 转到项目->构建设置->活动编译条件,然后将ENABLE_LEAK_CHECK添加到要测试的目标,您可以仅使用“调试”目标。 转到类HomeManager,在该类的末尾,添加以下代码以跟踪实例数: #if ENABLE_LEAK_CHECKinit(){type(of:self).instanceCount + = 1print(“ \(String(describing:self))\(#function)”)}静态var instanceCount = 0deinit {type(of:self).instanceCount -= 1print(“ \(字符串(描述:自我))\(#功能)”)}#endif 然后对HomeViewController,MyService,MyEntity执行相同的操作。 ( 这种实例计数跟踪的方法目前是相当手动的。我们可以通过添加一个类来跟踪实例计数,甚至跟踪与对象实例相关联的调用堆栈,来进行一些改进 ) 现在转到您的测试“ LeakIntegrationCheckTests.swift”,并查看该函数: func testLeakAfterLogout(){ } 在第57行的XCTAssert中注释掉第24行的注释。再次运行测试,它将通过。 您可能会问:为什么只有将XCTAssert放在tearDown()中才能通过测试? 让我解释! 当我们调用“ AppDelegate.shared.switchToLoginScreen()”以注销时,我们更改了窗口rootViewController。 尽管Window不再保留对旧ViewController(HomeViewController)的引用,但UIKit仍需要安排一些与旧ViewController有关的任务。 而且这些任务只能在我们的测试方法:testLeakAfterLogout()完成并将控制返回到主运行循环之后才能继续。 这就是为什么我们需要将泄漏检查放在tearDown()函数中的原因。 另外,我们需要在testLeakAfterLogout()末尾调用delayAndFlushTasks()来强制主线程执行所有待处理的任务,因此,在我们的测试函数返回之后,主运行循环可以使用旧的RootViewController继续执行计划的任务,并停止保留它。 在HomeViewController的deinit()上放置一个断点,您将看到deinit()由应用程序主循环触发。 这意味着HomeViewController在更改Window RootViewController之后不会释放,它可能在应用程序主运行循环的下一次迭代中释放。 现在,让我们对测试做一件事。 […]

Swift协议的用法-1

在上一篇文章中,我展示了使用快速扩展名进行打印的更智能方法。 并且在文章中,我敦促如果有人遇到在AnyObject上创建扩展的想法,请告知社区。 但是当我对此进行研究时,我知道这是不可能的。 但是与此同时,我很快遇到了面向协议的编程,我想可以将其用于实现我们的目标之一。 目标:我们需要避免使用与扩展方法po()相同的代码行 喜欢, 现在,使用面向协议的协议,我们可以执行以下操作, 因此,在上述类型的任何对象上都将允许使用po()。 po()的另一个优点是在同名空间中打印字典和数组,即anArrayObj.poa()或anDisctObj.pod() 今天就这些。 尝试以任何可能的方式使用扩展名,不要忘了❤️并发表评论并分享您的想法。 访问我的网站以查看到目前为止我已创建的应用程序http://www.linklyapps.in/

在Swift中是可选的(从示例开始)

在Swift中是可选的 Swift被设计为一种安全类型的语言。 随着Optional的引入,Swift解决了在Objective-C中变量可以为nil或不为null的问题,这使代码更加健壮和安全。 Optional就像一个盒子,您可以将普通类型(Int,String,object)放入盒子中,也可以将Optional本身放入盒子中。 var sz: String = “some string” sz = nil // compile-time error 尝试为sz分配nil时,上面的代码将弹出一个错误,错误消息: error: nil cannot be assigned to type ‘String’ 通过将变量sz作为可选类型,可以消除此问题。 var sz: String? = “some string” sz = nil // compile-time error

7:“孩子们在编码方面变得如此有创造力。” 和迈克·雅库波夫斯基

显示连结 苹果杰出教育者 C语言 乐高头脑风暴 实验室视图 Arduino的 斯威夫特语言 拉里·里夫(Larry Reiff) 克里斯·彭妮博士 道格拉斯·姜 斯威夫特游乐场 通过Swift课程进入应用开发(老师)(学生) 意外技术:情节205 —人们不要使用奇怪的零件 每个人都可以用Tynker编写K — 5 最喜欢的播客 有线教育播客 迅捷解开 运行 Swift Teacher播客Facebook页面 加入Swift Teachers Slack组-brian@swiftteacher.org 关注@_SwiftTeacher 关注@bfoutty 您还可以在我的博客上找到表演说明和其他信息: 迅捷老师博客