Tag: swift

在Xcode中安装Swift 5工具链

苹果发布了Swift 5.0开发快照(工具链),供开发人员试用新语言。 在本文中,我将解释如何将Swift 5.0工具链与Xcode捆绑在一起。 根据Apple的定义, “ Xcode工具链( .xctoolchain )包括编译器,lldb以及其他相关工具的副本,这些副本可提供在特定版本的Swift中工作时提供凝聚力的开发经验。” 使用Xcode捆绑Swift 5工具链 从这里下载Swift 5.0快照。 (在撰写本文时,Swift 5.0可以作为开发快照使用。其他快照可以在此处找到:https://swift.org/download/#snapshots) 2.打开下载的软件包。 按照屏幕上的说明完成安装。 3.打开Xcode并导航到Xcode->首选项->组件。 在这里,您可以找到Mac上安装的所有工具链。 4.选择“ Swift 5.0快照” ,然后单击“关闭”。 恭喜你! 我们已经在Xcode中成功安装了Swift 5工具链。 谢谢阅读。 如果您有任何疑问,请随时询问! 在推特上关注我

这些简单的步骤使您的iOS应用程序易于阅读。

优秀的程序员会以最简单的方式解释自己的工作。 甚至物理学家也用一张纸和一根铅笔在虫洞中进行解释。 是什么使我们与众不同? 我一直试图编写尽可能简单易读的代码,从为变量选择正确的名称到使用代码约定,但是仍然缺少某些东西,这是一种无需试图理解“如何我做到了,但我却想实现这一目标。 您甚至可能会说 将代码读为一个故事 ,而不是一堆代码。 让我们解决3个主要主题: 阅读其他程序员的代码可能是一场真正的斗争。 如果没有提供适当的上下文,人们只会发现他迷失了寻找功能或特性的含义。 从1和0到底层代码再到高级语言,值得注意的是,代码语法变得越来越人性化,从而吸引了新的程序员进入开发人员的视野。 随着语法变得更加清晰,以通俗易懂的英语阅读,所以我们的代码应该简单明了并且易于说明。 编写良好的代码会将自己掩盖为一个故事,使其易于阅读和理解(即使没有上下文)。 命名功能 如何正确使用它: 当我们编写函数时,我们假设阅读函数的人有足够的背景知识来理解我们试图实现的目标。 用“ handleRedView()”来命名我们的函数会引起很多关于“ RedView”代表什么的问题? 此功能的主要目标是什么? 似乎在某些情况下 , 功能目的含糊且过于复杂,无法在不提供上下文的情况下进行理解。 我们可以将功能建议分为4类: 1.线人功能 2.管理职能 3.路由器功能 4.执行功能 1.线人功能 通常触发路由器/管理功能。 功能示例: 回调函数,通知发生了某些事情/将要发生的事情,并为您提供了做出反应的选项。 通常用作委托触发操作或通知处理功能。 2.管理功能 用于组合多个功能以实现1个更高的目的而无需依赖, 该块内的所有代码都将执行。 阅读此功能后,我们将获得所需的所有信息,并在汽车启动时执行此功能,此时,我们不在乎“如何”完成工作,而在乎“做什么”。 3.路由器功能 用于将多种功能结合起来,以某种依赖性实现更高的目标1, 的 代码仅在意图时执行。 路由器功能主要指向 执行 功能,但在某些情况下,仅当代码不超过1行时,才可以包含逻辑本身。 4.执行功能 执行 功能 名称。 逻辑本身可能很容易理解,但是我们已经在名称中声明 了该功能的功能 ,该功能打开了外部灯,该功能检查了灯泡是否烧毁,了解这可以在将来简化查找错误的过程,并使其更容易向函数添加逻辑而不更改其名称。 最终,在将这些想法实现到您的应用程序中之后,您应该在类部分中将对象与信息人 , 管理者和路由器功能组织在一起。 以及扩展块中的所有执行/逻辑都在同一文件中。 […]

如何为初学者Swift4在TableViewController上轻松显示数据

我们要建造什么? 我们将建立一个tableview,显示与上图一样的名称。 我们要做的第一件事是打开Xcode,单击新项目,将其命名为您想要的任何名称,然后将我的项目命名为“名称”,然后选择单视图应用程序,然后单击“下一步”,然后单击“创建”并将其保存在所需的任何位置。 接下来,我们将清理我们的项目。 我们将从删除屏幕左侧的ViewController.swift文件开始。 右键单击ViewController.swift文件,然后单击“ 删除” 。 然后单击“ 移至垃圾箱”(不要单击“ 删除引用”) 现在您的项目文件应如下所示 接下来单击Main.storyboard并选择View Controller 然后按键盘上的Delete键,您可能会遇到一个小错误,当您按Delete键时,它不会删除View Controller,只需选择另一个文件,然后再次选择Main.storyboard,现在它应该可以工作了。 现在,我们将拖放一个TableViewController。 如果仍然有一个符号说ViewController,那么您要做的就是选择另一个文件,然后重新选择Main.storyboard以摆脱该符号。 如果您现在运行该应用程序(要运行,请单击左上角的播放按钮)。 屏幕将变为黑色,因为您的应用现在已经知道从哪里开始运行。 告诉应用您要从哪里开始。 单击TableViewController并选择属性检查器。 然后选择是初始视图控制器 现在,当您运行应用程序时,您将在模拟器上显示表格视图! 恭喜您取得了如此远的成就。 我们快完成了。 接下来,我们将创建一个TableViewController文件,该文件将链接到TableViewController,以便我们可以开始编写代码。 首先制作文件。 单击命令n ,然后选择可可触摸类 ,然后单击下一步。 接下来,我们将为班级命名。 我们将其称为NamesTableViewController。 确保为UITableViewController选择了子类选项,然后单击下一步,然后单击创建。 现在,您应该有一个名为NamesTableViewController的文件,这将是神奇的地方。 这是好东西。 我们需要做的第一件事是删除NamesTableViewController文件中的所有内容。 它应该看起来像这样。 好多了! 现在看起来不那么恐怖了。 在这里,我们将创建一个存储名称的数组。 像这样 现在是最困难的部分,但不是很难。 我们需要提供TableViewController将显示的数据。 为此,我们需要实现两个必需的数据源功能。 第一个是函数的行数,它仅告诉TableViewController应该显示多少行。 我们希望显示的行数与名称一样多。 因此,如果我们有4个名称,则要显示4行。 因此,从本质上讲,我们希望显示任意数量的名称。 让我们实现该功能。 如果您只是开始输入numberOfRo…。 单击Enter时,它应该自动完成。 在函数类型的花括号内, 返回names.count, names的计数就是我们拥有的名字的数量。 […]

我如何停止内存泄漏并回收150MB的内存— Swift

在iOS开发人员中,内存管理可能不是一个有趣的话题,但是如果您想将应用程序提升到一个新的水平,它需要引起注意。 内存泄漏的应用确实更有可能被iOS强制杀死。 为用户提供低于标准的体验。 好消息是,多年来,检测内存泄漏变得越来越容易。 XCode提供了一些非常好的工具,因此您可以修复并避免泄漏。 如果您在应用程序中遇到内存相关问题,或者只是想了解有关iOS中内存管理的更多信息,请在下面列出我的前3个资源。 实际上,我最近实际上已使用这些资源来修复应用程序中的主要内存泄漏。 Kaira Diagne撰写的Swift的Memory Management in Swift文章:该文章对该主题做了很好的介绍,并提供了一个内存泄漏修复程序的示例。 这个出色的Stackoverflow答案描述了如何使用XCode的Allocations Instrument,以及更新的“ Debug Memory Graph”选项。 后者绝对是救命稻草 。 这个惊人的Tweet基本上很有趣,可以捕获应用程序中的内存问题。 它解释说,您可以在XCode中放置一个断点,让您立即(仅通过播放声音)就知道UIViewController是从内存中释放的。 从第1天起将此断点添加到您的应用程序中,您肯定会在发生内存泄漏时及时发现它们。 在我的武器库中拥有这些工具后,我针对了应用程序中存在一段时间的内存泄漏。 该应用程序称为Buluttan,它是一款气象应用程序,具有自己的天气预报和警报。 在显示嵌入了Map的视图控制器时发生泄漏。 这是泄漏的发生方式: 看起来很恐怖,不是吗? 由于内存泄漏,在第二步中加载的MapKit永远不会从内存中删除。 该应用程序每次轻按都会变重,最终会从内存中消除力量。 这里发生的是第二个ViewController以某种方式创建了一个强大的参考周期。 导致无法将其从内存中删除 。 即使用户在上面的第3步中取消了地图,该地图仍在我们的记忆中。 强大的参考周期导致它不会被释放。 找出周期发生的地方实际上并不难。 通常认为强周期的原因是: 强委托:如果您在代码中使用委托模式,则很可能忘记了使用弱引用定义委托。 将委托工作的实体应具有如下定义的委托: 私有弱变量myDelegate:ImportantDelegate? =。无 如果没有weak关键字,则会立即引入一个强循环。 这也是我的问题! 我已经使用强大的委托初始化了LoaderView。 那造成了强大的循环! 2.封闭性强:大多数网络完成处理程序都作为封闭性从UI传递。 网络调用完成后,将调用这些处理程序,并且UI会自行更新。 如果您的网络处理程序实体对您的ViewController有很强的引用,则VC永远不会从内存中删除。 网络处理程序仍在指向它。 通过使用捕获列表使self成为弱引用,可以防止此情况: myNetworkHandler.fetchSomething {[弱自我](fetchedEntities)在 守卫让strongSelf =自我else {return} strongSelf.updateUI() […]

在Swift中实现编程语言—第5部分:Main函数

这是“用Swift编写编程语言”教程系列的第五部分。请务必阅读第4部分。 在之前的教程中,我们完成了为计算器实现Lexer和Parser的工作。 现在,剩下的一切我都可以简单地遍历AST并“解释”一些输出。 所以……快到了! 您可能已经注意到,我们在解析时创建的Nodes ( Float和InfixOperation )很容易将两个值都评估为Float值。 因此,要评估AST,我们要做的就是向Node协议添加一种协议方法,以解释每个单个Node并在Node结构中实现它: 协议节点{ func interpret()throws-> Float } // … 扩展浮动:节点{ func interpret()throws-> Float { 返回自我 } } struct InfixOperation:节点{ // … func interpret()throws-> Float { 让左=尝试lhs.interpret() 让权利=尝试rhs.interpret() 切换op { 案例.divideBy: 返回左/右 案例时间: 返回左*右 大小写减号: 返回左-右 案例.plus: 返回左+右 } } } 就是这样,现在我们已经准备好创建我们的main函数,让我们称之为run : func run(code:String)抛出{ let令牌= Lexer(代码:代码).tokens 让解析器=解析器(令牌:令牌) 让ast […]

您不应该在快速结构中存储什么?

答:参考类型。 您在任何地方搜索都会发现值类型和引用类型之间的差异。 但是,当您将两者混在一起时,文档尚不清楚。 该结构将失去其(表观)不变性。 让我们用一个例子来解释一下:假设我们正在使用一种结构来存储与广告相关的配置 struct AdConfig { var prefetchCount:Int var wrapperView:UIView? } 公司要求我们在每个屏幕上展示广告,因此我们决定使用静态默认值: struct AdConfig { var prefetchCount:Int var wrapperView:UIView? static let`default`:AdConfig = AdConfig(prefetchCount:10, wrapperView:UIView(frame:CGRect.zero)) } 太棒了! 现在我们可以使用AdConfig.default 无需显式创建实例的任何位置。 现在,在一个屏幕中,我们有不同的设计,因此,我们将复制默认实例并修改值: var customConfig = AdConfig.default customConfig.wrapperView?.backgroundColor = UIColor.red AM! 现在,无论您走到哪里,所有广告现在都具有红色背景,即使我们的默认变量是let常量并且应该是不变的。 您可以在操场上跑步: 因此,请勿在您的结构中存储以下任何内容: 迅捷类实例 任何NSObject子类 闭包(是的,它们是参考类型) 如果必须的话,请确保您了解它的含义(以及调试数小时和数小时来修复一些奇怪的错误)。

创建自己的CocoaPods库

介绍 作为iOS开发人员,您可能在项目中使用了一些CocoaPods库,并且您可能非常熟悉如何安装它们并调用它们的方法。 但是,您是否梦想过通过分发自己的pod(CocoaPods库)为iOS开源社区做出贡献? 想象一下,许多iOS应用程序都将使用您的超棒库,这不是太棒了吗? 在本教程中,我将向您展示如何分发一个简单的pod。 除此之外,您还将学习如何利用Travis CI和Codecov来确保您的Pod可靠可靠。 总览 有多种创建吊舱的方法。 最常见的方法是遵循CocoaPods官方文档Using Pod Lib Create,基本上,您可以使用以下命令快速引导Xcode工作区以开发新的Pod: > pod lib创建[pod名称] 在自举的工作区中,我不喜欢的一件事是,与单元测试有关的代码嵌套在示例目标内部,这对我来说没有意义。 经过一番尝试和错误之后,我找到了一种从头开始创建pod并很好地组织单元测试和示例代码的方法。 以下是创建窗格的所有步骤的快速概述: 设置Xcode项目和必要的目标 链接到Github 实施吊舱 编写单元测试 配置Travis CI和Codecov 发布广告连播 在撰写本文时,我正在使用以下软件: macOS Mojave 10.14.3 Xcode 10.1 斯威夫特4.2 椰子足1.6.0 好的,让我们开始吧! 设置Xcode项目和必要的目标 实际上,在创建项目之前,有一项重要的工作要做,让我们命名Pod SwiftyLib ,并确保未在CocoaPods上使用该名称,幸运的是,该名称尚未提交,因此我们可以继续进行。 创建一个Cocoa Touch Framework Xcode项目 在后台,CocoaPods库是Cocoa Touch框架库。 启动Xcode并创建一个新项目,选择Cocoa Touch Framework 。 输入名称SwiftyLib   ,选中Include Unit Tests复选框。 在下一页上,选择项目位置,不要Create […]

(ч.3)iOSндексШколаМобильнойРазработкиiOS //Обучение

Последняячасть Вэтойчастиянаконец-торасскажуосамомобучении) Такженемногореальныхисторий,кудажебезних。 Советуюдляполнотыкартинысначалапрочитатьпредыдущиичасти:перваячасть,втораячасть。 Затишьепередбурей Послевсехиспытанийпрошлооколотрехнедельинаконецмнепришлописьмо。 Немогусказать,чтоономеняпорадовало。 Хм…Наверноевэтотмоментувасвозникаютвопросы? Ничего,скоровсевстанетнасвоиместа。 😉 Наработеещепарачеловекнепрошли。 ,списалсясмладшимбратомиузнал,чтоеговзяли! Оченьпорадовалсязанего,ирешилчтообучениеемунамногонужнее。 Какужеупоминалвовторойтатеренва 可以使用Objective-C进行建模。Objectiveужедавноработаюпустьиссстарымдобрым。 Витоге,братначалготовиться,аянабралпроектовнаподраб​​откучтобызанятьвремя。 Черезнеделюяполучилстранноесообщениевтелеграмме。 ,тобылвопросотом,нуженлимнемакбукдляобучения。 тобылотаксмешноииодновременнотаааааакгрустно…😭 Да,насперепутали。 Братаневзялииз-заслабойтехническойчастииэтонельзябылопереиграть。 Оченьобиднаяситуация,онготовился。 ,ужераспланировалсвободноевремя,以及ужечерезпаручасовстартуютзанятиявшколе。 🚀墨菲定律:任何可能出错的地方都会出错。 Витогебратпонялсвойуровеньидумаюпоставилсебецель,намойвзглядэтооченьважныймомент。 Swift或Yandexииотдыхатьотработы的Аяотправилсяизучать。 Началозанятий ВэтотжеденьяотправилсявофисЯндекса,заполнилдокументыиполучилпропуск。 КакмнеобъяснилиспециальныхпропусковдляшколыiOSнет) Оченьудивилсоставгруппы,8парнейи2девушки。 98работалвразныхкомпанияхиобычновстречал98парнейи2девушки)Иэтонепосленнееооудивл Всеговшколебыло10занятийпродолжительностьюоколо2小时。 Первые8занятийбыли,грубоговоря,поосновам和остальные2наболееуглубленныетемы。 Занятияпроводилисьразвнеделюповечерам。 Послекаждогозанятияизпервых8нужнобыловыполнитьисдатьдомашнеезадание。 Накаждоезаданиебылдедлайн2недели。 Системаоценок: Базоваязадачана3; Усложнения*на4; Усложнения**на5。 ,небудурассказыватьподробноокаждойлекции,большаячастьпрезентацийвоткрытомдоступе。 Всессылкибудутвконцестатьи。 Тамтакжеестьтребованиякдомашнимработам。 Немногоолекциях 迅速在Swift中工作。 Затемрассмотрелиразличныеинструменты,архитектуру,UI,сетевойуровень,многопоточностьиCoreData。 Получилосьвседовольносжатов8лекций。 Дополнительнопровелилекциипогеолокацииипоработеприложениявфоновомрежиме,атакжеболе。 Домашнеезадание Каждоезаданиебылопосвоемусложно。 Например,重量级(ручными)миграциями。 Илисозданиекомпонентавыборацветасотрисовкойвсегоспектрацветов。 Всенужнобылописатьсиспользованиемтолькобазовыхбиблиотек。 Этопозволилоуглубитьсяиузнатьнекоторыетонкости,окоторыхяраньшеинезадумывался。 Намойвзглядзаданиядействительнобылиинтереснымииоченьполезными。 […]

Swift中的对象映射

大家好, 在本文中,我们将学习什么是对象映射及其重要性。 然后,我们将比较在Swift中映射对象的不同方式。 将给定集合(域)的每个元素与第二个集合(范围)的一个或多个元素相关联的操作。 ”中的术语。 在现实生活中应该在哪里使用地图? 通常,完成请求后,我们会收到各种格式的数据。 我在下面的示例中选择JSON。 这些数据格式应在我们的应用程序中转换为我们的模型。 这样我们就可以根据需要并根据OOP使用它们。 这些自定义类将使您可以在自定义类中对模型业务进行编码。 是否需要将JSON转换为自定义对象? 对! 否则,您需要将它们用作字典或其他某种数据类型。 这将使您的应用程序无法正常运行🙂 有很多方法可以映射对象。 让我们从最差的方式开始,即非映射方式 Swift的基本映射方式(Swift 3): 上面的示例中有一个人员结构。 首先,我们将向其添加一个init方法。 init(带字典:[String:Any]?){ 警卫队让字典=字典其他{返回} 名称= dictionary [“名称”]为? 串 姓=字典[“姓”]为? 串 age = dictionary [“ age”]如? 整数 } 然后像这样映射您的对象: var数据:Data = JSON.data(使用:.utf8)! 让anyObj =尝试! JSONSerialization.jsonObject(with:data,options:.allowFragments) let person = Person(with:anyObj!)//在这里映射 label.text = person.name 如果需要安全保护,请更改模型的可选参数并设置默认值: var名称:字符串? ==> var名称:字符串! var姓:字符串? […]

UITableView中的多个集合视图

我们是否曾经想过需要多个水平可滚动CollectionView的场景? 如果是,则继续。 我们将逐步进行。 让我们开始 打开Main.storyboard并添加UIViewController。 在UIViewController中添加UITableView并在tableview内添加tableviewcell 在UITableViewCell中添加一个UICollectionView并在其中添加一个UICollectionViewCell 将UITableView的约束设置为UIViewController为 topMargin = 0,leftMargin = 0,rightMargin = 0,bottomMargin = 0 4.在UICollectionViewCell中添加一个新图像,在所有上面添加之后,结构将如下图所示 5.接下来,我们必须将CollectionView的可滚动方向设置为水平。 6.将UITableview委托和数据源连接到UIviewController本身。 7.添加UITableViewCell类型的新文件,并将Storyboard中的CollectionView与新添加的文件连接。 类TableViewCell:UITableViewCell,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {@IBOutlet弱var collectionView:UICollectionView!} 8.接下来,在ViewController中,我们将实现UITableView的数据源。 表视图中的numberOfSection将等于所需的collectionview的数量。 在UIViewController中添加以下代码 导入UIKit类ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {@IBOutlet弱变量tableView:UITableView!部分:Int)->字符串? {返回“ Section Title \(section)”}}重写func didReceiveMemoryWarning(){super.didReceiveMemoryWarning()//处理所有可以重新创建的资源。} func numberOfSections(在tableView中:UITableView)-> Int {return 5} func tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)-> Int {返回1} func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell {如果让单元格= tableView.dequeueReusableCell(withIdentifier:“ tableViewCell”,的:indexPath)为? TableViewCell {返回单元格}返回UITableViewCell()}} 9.添加一个类型为UICollectionViewCell的新文件。 […]