Tag: 代码

回到学校

沃尔沃aprender aprender Decidícomenzar明显的应用程序。 y como cualquier newbie mesumergíen Google haciendo lasbúsquedasmásobvias 您可以在任何情况下,从任何地方获得房地产担保,并以书面形式获得任何信息。 苹果公司的iTunes开发人员:iTunes开发人员,苹果公司的发展史,斯坦福大学的历史博物馆,苹果公司的发展史,以及iTunes的发展史。 4个诅咒。 Caber Aclarar que esto paramíes a prueba y error,perodespuésde ver algunas clases su Sufácilexplicaciónthinkóque es un buen punto para empezar。 曼彻斯特动机的埃尔斯坦索英格里斯学院。 Ya con esta base para aprender desde cero,me di cuenta queteníaque Organizar misdíassiqueríasacar elmáximoprovcho。 组织化 从视频到视频剪辑,从las tareas y siendo到104个视频片段,由estamos dicien制作,并由al […]

枚举的许多面孔

对我来说这已经是忙碌的几个星期了,很高兴终于回到我可以适应例行程序的地步。 从单身派对到一个可怕的寒冷一周,再到哈德逊山谷度过一个愉快的假期,我再一次发现自己在布鲁克林,在计算机前编写代码(与之相对的另一种纸张和纸本一支钢笔)。 所以我们到了! Swift有了对Objective-C的许多改进(对于那些久经考验的真正的Objective-C开发人员,我很容易受到侮辱),从面向协议的编程到功能更强大的编程方法,甚至是围绕泛型的更好的API。 Swift中的许多功能使其成为令人愉悦的开发体验。 我个人发现Swift中的枚举很棒。 它们一直是我最常用的语言功能之一,以至于我可能对它们有些执迷,这是一个错误。 但是,我将介绍一些我认为枚举可能非常强大的案例,特别是 澄清看似任意的值 状态的封装 错误包装 澄清看似随意的值 枚举最适合用来处理似乎晦涩难懂,难以记忆的价值并为其应用含义。 这主要是因为它们是可读值。 我们每天在语言中使用的单词具有很多含义,我们可以在有些令人困惑的值之上轻松地传递该含义。 让我们以CAGradientLayer为例。 CAGradientLayer具有两个属性,即startPoint和endPoint ,它们都是CGPoint.实例CGPoint. 苹果将​​这些文件记录如下 绘制到图层的坐标空间中时,渐变的起点和终点。 起点对应于第一个渐变停止点,终点对应于… 这是对这两个属性的不必要的冗长描述。 这两个点都代表渐变开始的x和y坐标,范围从0到endPoint和endPoint的默认值endPoint为[0.5, 0] endPoint [0.5, 0]和[0.5, 1] endPoint [0.5, 1] 。 很难想象这意味着什么,但这是从上到下的垂直渐变。 如果要构建水平渐变层,则需要执行以下操作。 func horizo​​ntalGradientLayer()-> CAGradientLayer { 让渐变= CAGradientLayer() gradient.startPoint = CGPoint(x:0,y:0.5) gradient.endPoint = CGPoint(x:1,y:0.5) 返回梯度 } 即使现在只输入一次,我也必须考虑一下startPoint和endPoint可以正确定义水平渐变的不同可能性。 这种想法容易出错。 使用枚举定义渐变方向可以改善我们对渐变实际外观的可视化。 枚举GradientDirection { 垂直案例 案例水平 […]

构建像Lego这样的应用程序—教程10

创建插座和属性 1.简介 在教程9中,我们连接了NewsTableViewCell现有出口,并输入了所需的属性。 在本教程10中,我们将为第二个图像视图创建一个自己的插座,并在其中设置图像的属性。 这与我们进行真实编码所需的时间差不多。 大多数编码工作已经为我们完成。 我们在本教程中编写的模板代码对于我们以后创建的任何其他插座和属性将基本相同。 这是很难的,而且还不那么难。 2.显示Xib和代码 X在Xcode中,在项目浏览器中选择NewsTableViewCell.xib 。 我们需要同时查看该xib文件和相应的代码文件。 👉在工具栏中,单击Assistant Editor 。 👉您应该在右侧看到NewsTableViewCell.swift代码。 如果没有,请通过单击弹出菜单来检查右侧文件是否设置为Automatic ,如图所示。 👉如果您在屏幕上需要更多空间,请使用工具栏右上角的按钮或单击“ View菜单,然后单击“ Inspectors > Hide Inspectors器”来隐藏“检查器面板”。 3.创建一个插座 👉按住Control键(在键盘上),然后从xib的第二个图像视图拖动到代码文件中的class行下方。 code Xcode为新插座显示一个弹出框。 输入插座Name作为detailImageView 。 👉单击Connect按钮。 code Xcode为我们编写连接代码,并将其连接到xib中的图像视图。 👁您不需要了解它,但是如果您感到好奇,那么创建的代码行包括: 边距中的实心圆圈表示此插座已连接至xib中的某物。 @IBOutlet在边距中创建圆,并让Xcode知道它可以连接到xib中的视图。 weak意味着该应用程序可以在不使用任何连接时释放(忘记)此连接。 var表示这是一个“变量”,可以通过代码或连接进行更改。 变量是可以更改(即更改)的属性(也称为“属性”)。 detailImageView是我们之前键入的名称,它是此变量的名称。 : UIImageView将此变量的类声明为UIImageView 。 因此,此插座只能连接到UIImageView 。 感叹号( ! )表示必须先连接此变量,然后才能使用它。 也就是说,它必须具有一个值并且不能为零。 现在,我们已经完成了助理编辑器。 我们只需要使用Assistant Editor即可同时看到xib和Swift文件,以便我们可以控制它们之间的拖动连接。 can您可以使用工具栏中的三种编辑器模式的左侧切换回Standard Editor 。 […]

SmallSwiftTips#02:使用保留关键字

这篇文章中的SmallSwiftTips将向您展示如何在代码中使用某些系统保留的关键字(如果需要)。 声明枚举值时可以建立一个非常常见的示例。 假设我们有一个枚举,并且想要一个名为“ default”的案例。 这是一个保留关键字,因此如果您尝试使用它,您会发现您不能使用它。 使用“之间的名称,您将可以使用reserved关键字。 您可能希望在代码上使用一些保留的关键字,例如关联性,便利性,动态,最终,懒惰,左,变异,无,可选,覆盖,后缀,优先级,前缀,必需,右,弱。 通过本技巧,您可以毫无问题地使用它们,并在命名变量,枚举等时保持代码的一致性。 😁🚀

不要忘记注射和成分。 (迅捷4.2)

优秀开发人员的特性之一是预测项目中的更改并编写准备好应对这些更改的代码。 每个开发人员都知道依赖项注入和组合模式。 但是程序员经常不使用这些工具。 我的意思是,您经常会看到与网络一起使用的职责是一个单独的类,而另一个类则与数据库一起使用。 但是,较小的职责不会在单独的类中承担,而是属于某个模块的逻辑。 我认为这是不正确的,我将尝试解释如何进行更改。 如果您的困难模块看起来像是大正方形除以较小的正方形,那真的很好。 让我们尝试编写一些代码,然后以良好的方式对其进行重构。 我们的程序将包含一个图像和一个按钮,单击按钮后,该图像将带有alpha效果。 让我们编写代码。 首先,我们创建这个viewcontroller。 代码很简单,一切都很好。 现在,我想告诉您为什么此代码带有异味。 正如我之前所写的,将代码分成小块很重要,无论它是具有困难逻辑的大型服务还是仅用于呈现图像的助手。 在单独的类中,您需要分配所有单独的逻辑。 这是一个很好的例子,在单独的课程中,您可以处理图像。 下一步是重构。 🙂 最后一步是工厂。 这些控制器至少有两个配置。 Factory可以帮助您以一种更简单的方式生成新的控制器,并且通过这种模式,您可以随时为所有控制器装配零件。 有两种类型的图像渲染助手的工厂 上面,我试图向您展示,如果您在单独的类中组成甚至很小的逻辑块,也会更好。 我希望它是有趣和有用的。 如果您在代码中使用我的建议,那将是我的荣幸。

建立自己的框架库

框架是导入常用方法以及共享代码和与其他开发人员协作的非常有用的方法! 什么是框架? 框架是模块的一种类型:构建在一起并一起交付的已编译代码集合。 假设您在许多项目中经常使用几种方法。 您可以将这些方法从一张纸复制并粘贴到另一张纸,但是在项目文件夹中进行挖掘以查找代码行可能会非常麻烦。 相反,您可以将最常用的方法编译到单个.swift文件中,然后像导入其他任何框架(如UIKit或Foundation)一样将其导入。 Xcode带有各种内置扩展名,例如.count和.sorted,但是在本示例中,我们将使用可在Array类型上使用的.shuffle()方法。 它会使用交换功能“随机”地对数组中的值进行混洗,并且可以应用于[Int],[String]和任何类型的数组! 确保将您的扩展名声明为“公共扩展名”,以便在被调用时可以轻松访问它! 现在我们已经保存了我们喜欢的方法的.swift文件,我们可以开始构建我们的框架了。 建立框架 在Xcode中,您可以像其他任何项目一样构建框架,但是这次不用选择“单视图应用程序”,而是向下滚动并选择“ Cocoa Touch Framework”。 现在,通过将源文件 (刚创建的.swift文件)拖动到项目中或单击Xco​​de左下角的+,将其添加到框架的文件夹中。 导航器现在看起来应与以下类似: 大! 一旦完成,就可以关闭框架并创建一个新的Xcode项目(或打开任何现有项目)。 使用与上述完全相同的方法,通过找到框架的.xcodeproject文件并将其拖动或添加到Xcode项目中,将框架添加到Xcode项目中。 同样,请确保其正确嵌套! 现在,您的框架已成为项目的一部分,但它们尚未真正沟通。 要解决此问题,请打开框架的“产品”文件夹。 接下来,单击导航栏中的顶部项目(您的项目名称),然后在相应的页面上向下滚动到Embedded Binaries。 在此处,单击框架的.framework并将其从Products文件夹拖到Embedded Binaries中。 下一部分有点深奥,但是我发现它使导入运行更加顺畅。 单击同一屏幕的“构建设置”,然后向下滚动,直到找到“搜索路径”。 在“框架搜索路径”和“标题搜索路径”下,添加$(SRCROOT)并使其递归。 设置完之后,就该构建了! CMD + B 好,很好! 那么,我们现在该怎么办……行得通吗? 让我们找出答案! 转到您的ViewController(或您将要处理的任何文件)。 在顶部,尝试仅通过输入“ import”和您的框架名称(理想情况下应自动显示)来导入框架。 还有……瞧! 现在,您在框架中拥有的任何扩展类型都应适用于项目中的该值。 但是,哦,不……您忘记添加方法了吗? 不要害怕! 您可以随时关闭项目并更新框架,新框架将在您的项目中显示为最新! 现在就这些了,我希望这个简单而简短的教程将有助于使您的所有编码生活变得更加懒惰,更轻松,更高效。

如何从NSTokenField删除令牌? [迅速4.2]

在过去的几天中,我花费了大量时间正确地实现了具有某些拖放功能的标准NSTokenField。 知道了这一点,我们可以检查objectValue对象的类型是否等于我们期望的代表对象的类型。 如果确实如此,我们知道我们需要删除整个令牌。 然后,我们通过将stringValue拆分为一个数组并将其与objectValue中的对象数进行比较来检查对象数。 如果让 anyObjectsArray = control.objectValue 作为 ? [ 任何 ], 让 tokenFieldObjects = anyObjectsArray 为 ? [标签] { //现在,我们继续删除令牌… 让 stringObjectComponents = control.stringValue.split(separator:“,”) //检查令牌数是否等于tokenField的stringValue中的对象 如果 tokenFieldObjects.count == stringObjectComponents.count { //接下来,找出要删除的对象 } } 我们确信,我们必须删除令牌。 但是,在此阶段,我们不知道必须删除哪个令牌或多少个令牌。 幸运的是,找到它相对容易(当您知道时)。 如何找出要删除的令牌? 实例方法control(_:textView:doCommandBy :)还提供了NSTextView,如果您想找出光标在令牌字段中的位置,该类非常方便。 NSTextView有一个名为rangeForUserTextChange的方法,该方法返回一个NSRange,该NSRange由位置和长度组成。 var textChangeLocation = textView.rangeForUserTextChange.location 让 textChangeLength = textView.rangeForUserTextChange.length 我们暂时忽略长度 (稍后再讨论),并专注于location 。 我们只需要检查位置是否少于对象数。 如果是的话,我们需要将其减少1以获取对象在数组中的索引,因为数组的索引为零,而NSRange从1开始。 […]

单元测试。 开始。

你是一个伟大的程序员。 至少我希望如此。 即使您遵循SOLID,DRY和KISS原则编写了干净的代码,您的应用程序也会出现错误。 显然是因为算法。 您可以为新的数据传输算法创建出色的逻辑,但是如果在代码中实现它时犯了一些错误,它将无法正常工作。 单位代码使您可以自动测试代码的逻辑。 您需要编写一个测试,并且该测试将在每次对代码进行任何更改时运行。 让我们编码吧! 哦停下来 下载我为您制作的启动项目。 https://yadi.sk/d/2qbUCjKJNRAccQ 只有一个包含逻辑的类,我们将对其进行测试。 导入Foundationclass数学:NSObject {静态函数add(value1:Int,value2:Int)-> Int { 返回值1 +值2 } 静态函数减法(value1:Int,value2:Int)-> Int { 返回值1 —值2 } 静态函数乘法(value1:Int,value2:Int)-> Int { 返回值1 *值2 } 静态函数Divide(value1:Int,value2:Int)-> Int { 返回值1 /值2 } } 打开测试导航器,然后单击+ 选择“新单元测试目标”。 您将看到从XCTestCase继承的新创建的类。 导入XCTestclass UnitTestsStarterTests:XCTestCase { 覆盖func setUp(){ super.setUp() } 覆盖func tearDown(){ super.tearDown() } func testExample(){ } […]