Tag: 编程

变得不舒服

舒适区之外的第一步最可怕 内森·霍瑟尔顿(Nathan Hosselton) 舒适区就像腋下。 我们都得到了它们(有时它们会发臭)。 无论是在个人还是专业上,我们都倾向于坚持我们的世界小角落,因为它们给了我们控制感。 那里的一切都是可怕且不可预测的。 但是在这里 ? 这是我的领域,我是它的主人。 就个人而言,我的舒适区域是坐在电视前的沙发上,有一个很好的视频游戏。 从专业上讲,这是iOS开发。 我可以做iOS开发。 我知道来龙去脉。 没什么让我感到害怕的,因为几乎没有感觉到它。 不知道是什么,我不仅仅是说“我还不知道”,因为其中有很多。 我说的是未知的“我不知道,这让我感到恐惧”,就像一个房间的一个黑暗角落,这个角落一直未被开发,因为谁知道那里可能藏着什么 ? 最好只是避免它。 在iOS中,我没有剩下太多的死角了。 我觉得有能力弄清楚大多数事情。 我很舒服 。 感到舒适的技巧很棒。 这意味着您可能已经计时了10,000小时,并且已经掌握了。 我绝对不是埃迪·范·海伦(Eddie Van Halen)(甚至没有亲近),但是我一生弹了足够多的吉他,所以我知道我可以通过足够的练习来弹奏任何我想要的东西。 弹吉他对我来说很自然。 我真的不需要考虑,我的手指只是移动。 当我在Swift中编程时,也可以这样说。 然而。 舒适有其缺点。 最危险的是,这是无聊的滑坡……而无聊却无处可走。 如果您想用自己的技能去新的地方,则必须采取的第一步是在舒适区之外进行,这很容易使人感到恐惧。 不用了,谢谢! 我只待在这里,我什么也不会跳出来! 您可以使它不那么恐怖。 您可以选择相差无几的东西。 我举一个例子: 当我在芝加哥的Mobile Makers Academy上完成了如何制作iPhone应用程序的8个星期的学习时,我要做的第一件事实际上并不是制作应用程序。 Swift刚刚发布,这意味着像我这样的开发人员将经常在项目内和项目内在Objective-C和Swift之间来回切换。 我认为,如果Xcode允许您为两种不同的语言设置不同的主题,那将很酷。 当然没有,但是我知道插件可以改变Xcode的行为,因为当时我在使用其他几个(RIP)。 因此,我想知道插件是否可以根据语言更改主题。 这是我走出舒适区的第一步。 我不知道如何编写Xcode插件,但是我知道其他人也可以,我知道他们的源代码可以在GitHub上查看,并且我知道我将用我已经熟悉的Objective-C编写它。 。 这不是一个巨大的飞跃。 感觉可以实现。 这很吓人,但也不是太吓人。 我知道,即使我失败了,我仍然可以自己学到一些可以在面试中谈论的东西。 事实证明,我并没有失败,但这确实很艰难。 […]

教程:在Swift中获取用户的海拔高度

大家好! 这是我关于Medium的第一篇文章。 我想从一个非常简单的教程开始:如何获取用户设备的当前高度。 我们走吧! 我们将创建一个简单的应用程序,该应用程序可以检索用户的海拔高度并将其放入标签的文本中。 首先,让我们创建一个单视图应用程序: 确保取消选中单元和UI测试以及核心数据,我们不需要它们。 然后在Main.storyboard中创建一个简单的标签: 将其连接到您的视图控制器,让我们靠近代码。 但是在实际编码之前,我们需要执行最后的非编码操作:正在根据用户的位置计算海拔高度,我们需要请求对其进行访问。 因此,让我们转到Info.plist文件并创建2个属性:“ 隐私-位置始终使用说明 ”和“ 隐私-使用时位置使用说明 ”: 而已。 现在是时候编写代码了。 在您的ViewController.swift中,导入CoreLocation。 这是Apple的框架,“ 提供服务来确定设备相对于附近iBeacon的地理位置,高度,方向或位置。 ” 然后创建一个CLLocationManager实例,并将其一些属性设置为以下值: 希望本教程对您有所帮助。 请享用!

Swift101。将坐标转换为城市名称并返回

在本文中,我将说明如何从地理位置对象以及其他方法获取城市,国家/地区,邮政编码等的名称。 我们要做的第一件事是将所需的权限设置到Info.plist文件中,以便能够要求用户访问此手机的GPS模块。 打开Info.plist并设置以下内容。 在关键字段中输入NSLocationWhenInUseUsageDescription ,然后按回车键。 它将自动变成“隐私-位置……”。 与NSLocationAlwaysUsageDescription相同。 确保在值字段中添加一条有效消息,以描述应用程序为何需要位置权限的原因。 好的文字很重要,因为Apple 只会在说“ lorem impsum”时拒绝该应用程序。 到过那里。 从字面上看done 您可以选择要使用“使用中的位置”还是“始终”。 从逻辑上讲,第一个仅在打开应用程序时才使用GPS模块。 即使关闭应用程序,后者也会使用该位置。 除非您有充分的理由,否则不要使用第二个版本。 最近,在Uber将设置更改为“始终”时,美国街头发生了广泛的骚动,除了明显的原因,它只是跟踪用户。 也许不是字面上的🤪 首先,我们将创建一个帮助程序类,其中包含我们的逻辑以从位置生成城市名称,并返回位置以及获取设备位置。 我们将其称为LocationManager.swift ,最重要的是,我们需要导入CoreLocation框架。 在我们的课程中,我们将创建核心位置管理器的实例对象,并设置委托,将所需的精度设置为最佳,并要求获得使用iPhone位置服务的许可。 重要:在我们的示例中,我们希望用户(您)允许这些权限。 我们将不处理否认案件,因为这将超出本文的篇幅。 在您的应用中,您绝对应该处理这些情况。 我们的下一个目标是在我们的示例ViewController上的标签中显示当前位置的地址值。 我们将添加一个获取当前iPhone位置并使用Apple的GLGeocoder类及其reverseGeocodeLocation函数的函数。 我们首先检查错误是否为nil,如果不是,则在此停止(使用return)并打印错误。 与检查地标对象是否存在相同。 该对象可能为nil。 因此,请在出现错误的情况下在您的应用中处理这种情况。 给用户良好的体验很重要。 重要:Apple希望我们 为每个流程调用 创建一个新的 GLGeocoder 对象。 例如,每当您要为位置调用新的地标对象时,请使用新的 GLGeocoder 对象。 这就是为什么对象是函数的一部分,而不是类的一部分的原因,因为我们通常会处理重复调用的对象。 如果一切正常,我们将在完成处理程序(异步)中返回地标对象。 最后,我们要获取一个文本位置并返回一个地理位置。 对于我们的示例,我们将使用法国巴黎的埃菲尔铁塔的位置,并在地图视图上显示该位置。 根据Google的说法,该地址是“战神广场(Champ de Mars),法国第五大道Anatole法国,邮政编码75007,法国”。 现在,我们将创建一个再次使用GLGeocoder的函数,但这一次是GLGeocoder函数,以再次获取一个地标对象。 这次使用地标的location对象。 我希望本教程能够解释GeoLocation的基础知识,以及如何在我们的App项目中利用它。 留下一些爱🙂 在Github上找到示例项目。

了解Git版本控制并学习如何在Xcode中使用它

每个人都会犯错,这是人类的一部分。 我敢肯定,每个读过这篇文章的人都会一次又一次在代码中犯了一个严重错误,并希望他们可以将项目恢复到一个小时前的方式。 像这样的错误就是为什么每个程序员都应该对所有项目都使用源代码控制。 不使用源代码控制与不备份计算机一样糟糕。 一次事故或数据丢失事件可能会损害您的整个项目。 源代码控制可帮助您返回项目的较早版本,以便您可以恢复丢失的数据或查看代码随时间的进度。 使用源代码管理时,与您的项目中的其他人进行协作也非常容易。 许多人会同意Git是最好的源代码控制形式,这对我们来说是幸运的,它是Xcode内置的! 常见的误解是GitHub和Git是同一件事。 这不是真的。 Git是在计算机上本地运行的源代码控制系统。 GitHub是一项在线服务,可让您将Git存储库存储在云中。 可以考虑使用iCloud Drive,但要提供代码,并具有更多功能。 随着Xcode 9的推出,Apple与GitHub合作,使开发人员可以轻松地在其应用程序中使用源代码控制。 在iOS项目中使用Git和GitHub不再需要使用命令行。 一切都内置在Xcode中! 在本教程中,我将向您展示Git的基础知识以及如何在Xcode中进行设置和使用。 我还将介绍如何连接您的GitHub帐户,以便您可以将代码存储在云中。 注意:本教程使用的功能仅在Xcode 9和更高版本中可用。 在继续操作之前,请确保Xcode是最新的。 在继续之前,您还应该在GitHub上拥有一个帐户。 由于我们在这里学习的是GitHub,而不是Swift,所以我使用的Xcode项目非常简单。 足以向您展示GitHub如何工作。 您可以在制作项目时继续学习,也可以随意使用自己的项目。 如果您使用自己的Xcode项目,请跳至How Git Works部分。 让我们开始一个项目! 打开Xcode,然后单击File and New Project 。 选择“ 单视图应用程序”,然后为您的项目命名。 我称其为Git Tutorial 。 将语言设置为Swift,我们将不需要此项目的核心数据,单元或UI测试。 现在这部分很重要! 在下一屏幕上,确保已选中“ 在Mac上创建Git存储库” 。 这将为您的项目目录初始化Git。 之后,点击创建 ,您就可以开始了! 因此,在继续使用GitHub和Xcode之前,让我们先谈谈Git的工作方式。 此图显示了Git存储库中文件可以处于的不同状态,以及可以在它们上使用的命令。 工作目录是您当前正在编辑文件的位置。 暂存区域是提交之前将文件添加到的区域。 此处的文件被视为“已暂存以提交”。 当您提交这些文件时,它们会被添加到本地存储库中。 […]

枚举与结构…

像保存属性和方法的类一样,枚举和结构也可以具有与之关联的方法。 这些类型在现代编程中非常方便。 枚举: 关键字枚举用于定义枚举数据类型。 枚举或枚举是一种数据类型,它允许您定义可能(相关)值的列表。 枚举名称应以大写字母开头(例如:枚举DaysofaWeek)。 枚举可以具有原始值或关联值。 我们将在以下两个步骤中进行介绍。 像类一样,枚举功能也可以通过确保标准协议功能来扩展。 具有原始值的枚举: 原始值可以是字符串,字符或任何整数或浮点数类型。 每个原始值在其枚举声明中必须唯一。 将整数用于原始值时,如果未为某些枚举成员指定任何值,则它们会自动递增。 如果为任何成员分配了任何原始值,则为其余成员分配的原始值将从该给定值开始增加。 使用init?(rawValue:)初始化程序从原始值创建一个枚举实例。 它返回与原始值匹配的枚举大小写或为nil。 具有关联值的枚举: 在以下示例中,尝试在不带切换大小写的情况下访问关联的值。 您会收到编译器错误! 我们可以在开关盒中访问它们。 差异:(来源:https://www.tutorialspoint.com/swift/swift_enumerations.htm) 结构(struct): 在快速编程中,结构是灵活的构建基块。 关键字“ struct”用于创建结构。 结构支持许多与类相同的行为,例如方法,初始化程序。 结构和类之间最重要的区别之一是,结构在代码中传递时始终会被复制,但是类是通过引用传递的。 这就是为什么我们只说结构是值类型,而类是引用类型。 当您创建一个结构实例,并将该实例传递给其他变量时,该结构被复制,最后将有两个结构对象。 如果与类相同,则该类实例的地址将被复制到第二个变量中。 如果您更改一个属性的任何值,则更改将反映在两个对象(属性)上。 如果使用结构,则更改仅发生一个实例。 与类的第二个不同之处是,结构会为其成员或属性提供默认的初始化程序。 甚至我们都可以在struct中编写我们的便捷初始化程序,以便更轻松地使用它们。 通过结构名称访问结构的成员。 注意(提示):如果我们在struct的扩展中编写我们的便捷初始化程序,则可以通过我们的便捷初始化程序或带有struct成员的默认初始化程序来初始化struct对象。

在Swift中实现编程语言-第2部分:语法-设计我们的第一语言

这是“用Swift编写编程语言”教程系列的第二部分。请务必阅读 第1部分 。 如本系列的介绍中所述,我们将首先创建尽可能最小的“实用”解释器之一,即我们自己的计算器,仅包括数字*,/,+和-。 不够激动? 不用担心,因为稍后,我们将把它用作我们自己的编程语言的基础。 为什么我们关心语法? 在接下来的教程中,我们实际上将使用3个核心模块来实现我们的解释器,每个模块都在自己的教程中。 词法分析器 :执行词法分析。 这是关于将输入的字符串转换为令牌列表,令牌的信息结构比简单的字符或单词还丰富。 解析:关于将令牌转换为称为抽象语法树的树结构。 主要功能(解释过程):该函数使用我们的Lexer和Parser创建抽象语法树 ,然后通过遍历它来“解释”输出。 在执行之前,我提到的所有步骤都不需要正式的语法。 但是我还是出于某种原因决定将本章包括在语法中: 当我学习计算机科学时,我发现关于形式语言的教科书很少能轻松地解释语法。 对我来说,他们对这个问题有太多的满足感,这反过来又使这个概念过于艰巨。 维基百科也是如此。 实际上,可以使用OysterKit和ANTLR4等工具从语法(半)自动生成前两个步骤(Lexer和Parser)的高度优化的实现。 因此,我发现有必要在我们开始手动实现此功能之前引入这些选项(不过,请保证,我发誓我会使其易于理解)。 “上下文”一词并没有太多上下文 在实现我们的计算器之前,毋庸置疑,我们必须从设计语言的结构开始。 为此,我们将为我们的语言创建上下文无关的语法 。 上下文无关的语法是一组生产规则,它们以给定的形式语言描述所有可能的字符串。 生产规则是简单的替代。 例如,规则 A⇒α 用α代替A (维基百科) 现在是一些定义的时候了: 非终结符是可以用其他符号代替的符号,例如“α”。但是,如果“A⇒α”是我们唯一的规则,则这意味着“α”无法用某些东西代替其他。 因此,它是一个终端符号。 但是,“上下文无关”到底是什么意思? 所谓“上下文”,是指符号在文本中出现的位置。 更具体地说,在特定符号之前或之后的符号。 可以根据上下文将语法分为两类:上下文无关和鼓声…上下文相关。 我发现区分两者的最佳方法是简单地比较两个示例。 每种类型一个。 请考虑以下两个语法: :: = 0 1 | 01 和… :: = 0 1 :: = 0 […]

使用LLDB调试Swift代码

作为工程师,我们将近70%的时间用于调试。 其余的20%会继续考虑架构方法+与队友进行交流,而实际上只有10%会继续编写代码。 调试就像是犯罪电影中的侦探一样,而您也是凶手。 —通过Twitter的Filipe Fortes 因此,使我们这70%的时间尽可能愉快是非常重要的。 LLDB进行了救援。 花式Xcode调试器用户界面显示所有可用信息,而无需键入单个LLDB命令。 但是,控制台仍然是我们工作流程的重要组成部分。 让我们分解一些最有用的LLDB技巧。 我个人每天使用它们进行调试。 LLDB是一个强大的工具,它内部包含许多有用的命令。 我不会全部描述。 我想向您介绍最有用的命令。 所以这是我们的计划: 探索变量值: expression , e , print , po , p 获取整体应用程序的状态+语言特定的命令: bugreport , frame , language 控制应用程序的执行流程: process , breakpoint , thread , watchpoint 荣誉奖: command , platform , gui 我还准备了有用的LLDB命令的图以及说明和示例。 如果需要,可以将其挂在Mac上方以记住这些命令🙂 命令: expression , e , print , po […]

ViewController tidak boleh tahu ViewController放宽吗?

[Artikel ini akan terus diupdate sesuai dengan apa yang diketahui penulis。 Jika kalian menemukan kesalahan, 随时免费获得菜单!] Di ViewController编程指南,请参见ViewController的使用。 或者至少是ViewController的dia tidak punya pengetahuan tentang apa sebenarnya。 h,迪尼尼·彭拉桑·伯亨蒂。 Tidak ada contoh kode dimana konsep itu harus dijalankan oleh开发人员(程序员)。 Ini tentu membuat saya(pribadi)kesulitan。 苹果(Apple),西班牙菜(Karena Masih新手)面包(Baenamana merealisasikan Hal Tersebut)。 Paragraf yang dibuat dalam bentuk Quote di atas adalah paragraf […]

为什么viewWillAppear没有被调用?

您为什么期望如此? 最有可能的是-您想知道您的用户将要看到一个屏幕。 有各种各样有用的理由想要这个。 也许您想跟踪分析屏幕视图,或触发数据获取以保持屏幕新鲜。 无论您的目标是什么,有人都可能告诉您检查viewWillAppear -好消息。 它会实现这些目标,但有时会起作用。 * 简单答案 调用viewWillAppear的技术原因很简单。 通知视图控制器其视图将被添加到视图层次结构中。 它不能是任何视图层次结构-它必须是在根目录下具有UIWindow视图层次结构(不一定是可见窗口)。 如果您从一个选项卡跳到另一个选项卡,或者从UINavigationController推送并弹出,那很好。 iOS正在从视图层次结构中删除视图,并每次都将其重新插入。 在所有这些过程中,视图仍保留在内存中,因此不会重复调用viewDidLoad 。 但是,当您开始在当前屏幕上显示视图时会遇到麻烦,因为有时*它将删除基础视图,但有时*不会。 展示您的View Controller 这完全取决于您如何呈现模态视图。 如果可能的话,iOS倾向于删除基础视图(内存很宝贵)。 但是,如果您的设计师坚持要保留该基本视图,则可以要求iOS通过设置正确的.modalPresentationStyle来保留它。 您可以选择以下选项,以及关闭后是否在其父视图上触发viewWillAppear : UIModalPresentationStyle选择 .none的文档说…… “不要使用这种样式来呈现视图控制器。” 他们通过崩溃强制执行此操作。 感谢Apple让我们保持警惕! 备用计划 当下面的视图保留时,关闭叠加视图时将不会调用viewWillAppear 。 要开展业务,您必须在dismiss呼叫中加入完成处理程序。 将引用传递给呈现的视图控制器的最佳方法是什么? 这确实取决于您如何设置应用程序,这超出了本文的范围。 缺失的环节 当我们将视图添加到窗口的视图层次结构时,iOS如何知道要通知哪个UIViewController ? 从UIViewController文档中,我们可以看到它具有对其拥有的view的引用,但是UIView文档中没有任何内容表明它知道哪个UIViewController拥有它。 这些present方法也没有什么特别的事情发生-即使直接添加视图, viewWillAppear调用也会发生。 仅仅因为苹果不告诉我们发生了什么,并不意味着我们就无法做出有根据的猜测。 让我们偷偷摸摸,检查专用API… 查看所有这些额外的属性! 而且只有一种具有我们要寻找的类型…… UIViewController* _viewDelegate; 让我们通过创建2个视图控制器进行测试。 我们将一个注入到另一个view的_viewDelegate中,并将该view添加到窗口的视图层次结构中时,应调用注入的视图控制器的viewWillAppear 。 自己尝试一下! 警告 —请勿使用私有API交付应用程序。 这是一种危险的编码方式。 这些属性是私有的,Apple保留在不通知您的情况下随时更改其基础实现的权利。 […]

Swift CAShapeLayerで図形にグラデーションをつける方法

UIViewにCAShapeLayerを补充し図形を表示できる。CAShapeLayerのプロパティには,fillColor(背景を涂る色指定)やstrokeColor(図形の轮郭を书く时の色指定)が用意されているので,简単に図形に色を涂ることができる。 ではCAShapeLayerで背景色にグラデーションショ场合はどうするのか? 毎回忘れるのと误解していたので整理がてらメモ。 CALayerの面膜 ayラデーションを付ける前にCALayerのmaskの机能を见てみる。 口罩— CALayer | Apple开发人员文档 var mask: CALayer? { get set } を,别のCALayerを面具にセットすると,もともとのCAlayerの図形が「マスク」され部分的に表示されるという机能である。 面具サンプル 赤い星のCAShapeLayerに黒丸4つのCAShapeLayerをmaskとして设定すると,星の一部が切り抜かれて表示される。 黒丸4つのマスクと重なった部分が表示されたのだ。 如Swiftコード。 黒丸マスクCAShapeLayer // mask path let maskpath = CGMutablePath() maskpath.addEllipse(in: CGRect(x: 10, y: 10, width:30, height:30)) maskpath.addEllipse(in: CGRect(x: 10, y: 60, width:30, height:30)) maskpath.addEllipse(in: CGRect(x: 60, y: 10, width:30, height:30)) maskpath.addEllipse(in: CGRect(x: 60, y: 60, […]