Tag: 编码

在Swift中开始使用自定义代理的两种方法

您是Swift委派的新手吗? 让我们讨论两种在代码中开始使用委托和协议的好方法。 但是首先,代表是什么? 委托是一种设计模式,当特定事件发生时,该模式允许一个对象与另一个对象进行通信。 委托对象保留对另一个对象(委托人)的引用,并在适当的时间向其发送消息。 这使我们可以更新委托以反映事件的完成。 大! 因此,让我们谈谈开始实现自定义委托的最简单的地方。 显示弹出窗口并检测与该窗口的用户交互 要创建一个弹出窗口,请在您的项目文件中添加一个新的CocoaTouch View Controller类,然后选择“还创建XIB文件”框。 这是我们将构建弹出视图的地方。 我们将其命名为“ PopUpViewController”。 这将是我们的委托对象。 在您的.xib文件中,添加两个按钮。 将出口链接到您的PopUpViewController.swift文件。 我们将第一个按钮命名为“ optionAButton”,第二个按钮命名为“ optionBButton”。 目的是从您呈现的视图控制器中检测用户选择哪个选项。 让我们将呈现的视图控制器称为“ MainViewController”。 我们还将这个视图控制器称为我们的委托 。 我们将需要在两个班级之间进行交流-这是委派非常有帮助的地方! 第一步是创建一个协议。 什么是协议? 协议定义了一组功能,属性或其他要求以完成特定任务。 协议可以由类,结构或枚举所采用,而类,结构或枚举又将提供那些要求的实现,并且据说该协议符合该协议。 因此,基本上,协议定义了将委派的职责。 因此,回到我们的代码。 让我们在PopUpViewController.swift文件的顶部添加一个名为“ PopUpDelegate”的协议。 我们将在我们的协议中添加两个功能(认为是“责任”),我们的代表以后将实现这些功能。 它看起来像这样: 您可能会注意到,我们还在PopUpViewController上添加了proxy属性。 这样便可以通过我们的MainViewController对其进行访问。 稍后,您将看到MainViewController将PopUpViewController的委托分配给它自己。 接下来,让我们为两个按钮连接IBAction。 这里要记住的重要一点是IBAction会检测与PopUpViewController的用户交互。 一旦进入该函数,就让委托人知道我们正在调用委托方法。 现在,让我们回到MainViewController并实现我们的委托方法。 (提醒一下,这些方法是在我们的PopUpDelegate协议中定义的,并在我们的PopUpViewController中调用的。现在,该调用它们了,现在该决定做什么了 !) 首先,我们的MainViewController需要符合PopUpDelegate协议。 在类定义之后添加协议,编译器将给您一个错误,指出MainViewController类不符合PopUpDelegate协议。 所以,让我们修复它! 我们将添加PopUpDelegate协议中列出的两个函数。 现在,我们仅打印出已按下特定按钮。 我们仍然没有办法看到我们的PopUpViewController。 因此,让我们在MainViewController中定义PopUpViewController类并推送弹出窗口。 我们将在MainViewController上添加一个按钮,用户可以按下该按钮以显示弹出窗口。 然后,别忘了将PopUpViewController的委托分配给MainViewController的重要步骤! […]

创意简洁编码

本周,我们在有关参数和编码方面的学习非常出色,以解决本周在Apple的Learn to Code 2 Swift游乐场中的难题课程。 我很高兴教这些课程,因为我记得我在学习编码时发现参数对于编写简洁的代码有多么强大和有用。 在我们的Swift编码课程中,作为常规课程的一部分,我将为学生提供AirPlay操场,以便我们讨论该学生如何解决Swift操场难题。 之所以这样做,是因为我不断地强调,没有一个人会总是拥有所有正确的答案,或者总是拥有最好,最简洁,最具表现力的代码。 因此,我们(包括我)可以通过分析彼此编写的代码来学习一些东西。 学生展示自己的工作所使用的代码和解决问题的策略的剖析是我所拥有的一些最佳可教的时刻。 我认为“在特定位置放置”课程/操场会是一个非常棒的课程,因为它需要将多个参数传递给函数。 我是对的。 正是由于这个原因,这是一个很棒的课程/操场。 这个运动场使学生有机会创建两个功能并使用 world.place 函数传递三个参数: (expert, at Column: Int, row: Int) 这样,学生就可以通过创建一个函数来解决难题,专家可以将其前进,旋转,收集宝石等。创建这些函数后,学生可以用七行代码来解决难题。 这是遵循本课精神的一个典型的,预期的结果。 这是以下典型答案的示例: iPad的Swift Playgrounds:Brian Foutty在Vimeo上的特定位置放置。 但是,我的一位学生Elliot决定采用本课程的目标,即从字面上解决难题,并以尽可能少的代码行来解决难题。 我的许多学生为尽可能有效地解决难题而感到自豪。 Elliot将代码效率的挑战提高到了我未曾想到的水平。 他认为解决难题的最有效方法是使用新的 place 结合新方法 atColumn:和row:参数 将他的expert角色放置在第一个宝石的确切图块上,并让他的专家收集宝石。 然后,他让他的expert角色移至下一颗宝石,并为所有三颗宝石​​重复该过程。 Swift Playgrounds:来自Vimeo的Brian Foutty创意简洁的编码。 Elliot非常迅速地完成了对操场的编码,并向我展示了他的解决方案。 我说:“太棒了!”他使用可用的代码以独特,有效和出乎意料的方式解决了这个问题。 然后,我们的班级能够进行讨论,以满足特定任务的严格要求,并学习编程以解决当前问题,同时使我们的代码具有足够的通用性,以用于其他游乐场或场合。 我认为Elliot的回答不会被创建该游乐场的Apple团队预期为可能的解决方案。 但是,与青少年一起工作通常会为成年人提供一种独特的方式来研究问题以及如何解决问题。 然后,作为教育工作者的任务是确保学生理解,无论他们多么聪明,简洁和有趣,您都无法通过捷径来解决所有问题(无论是否编码)。 注意:以下是一个截屏演示视频,向您展示如何在Swift Playgrounds应用中记录屏幕。 来自Vimeo的Brian Foutty的Swift Playgrounds屏幕录制。 最初发布在iFoutty.com — Swift Teacher

Swift 3.0:懒惰存储的属性,变量观察器,KVO(💤)

很快,概述一下Swift中需要了解和掌握的三个重要概念🔥许多人可能听说过惰性变量和键值观察,但是这些甚至意味着什么? 🤔我什么时候应该使用它们? 我应该注意什么后果或危险信号吗? 🛑 路线图🚗 路线图太棒了! 我认为不仅听力理论而且使用示例都具有重大价值💡对于每个主题,我都尝试包括一个基本示例和一个实际的制作示例💎 A.惰性变量 1. 什么 是一个惰性变量 2. 为什么 他们很重要 3. 如何 实施 4. 特别 笔记 5. 基本理论示例: 人员结构 uc 6. 实际生产示例: 化身 🤠 B.可变观察者🕵️ 1. 什么是变量观察者 2.关于计算属性的快速聊天🖥 3. 为什么重要 4. 如何实施 5. 特别说明 6. 基本理论示例:userStatusText🎮 7.实际制作示例: 游戏得分 👾 C.关键价值观察者(KVO)🔑 1. 什么是关键价值观察者 2. 为什么这很酷😎 3. 如何实施 4. 特别说明 5.实际的生产示例: 网页下载进度 👨‍💻 […]

更好的表格视图数据源:捕获和传达状态

关于本机应用程序中更健壮的表和集合视图的实用指南 我构建的几乎每个本机UI都植根于表或集合视图。 我已经写了关于 表视图及其数据源的方法 ,这是高级入门。 这篇文章概述了开发人员编写代码时面临的常见问题; 倾向于将边缘案例处理推迟到以后的日期,这永远不会发生。 我关注的主要情况是加载,加载错误和无数据,但是我下面介绍的方法可以满足您的任何需要。 并非所有人都忽略了这些极端情况,但是我注意到,如果对它们进行处理,它们通常是在表视图之前处理并通过UI的生命周期进行管理(例如,当前视图控制器,启动加载,显示旋转磁盘,从DA返回,隐藏旋转磁盘,重新加载表)。 我更喜欢将加载/错误/无数据UI直接合并到表视图本身中,更重要的是,我希望数据访问和状态捕获独立于UI及其生命周期。 当您具有由依赖于可能处于不同加载状态的不同数据源的节组成的表视图时,这将带来很多好处。 当数据可用时(逐节)呈现数据通常很重要,而不是等待所有数据全部可用。 而且只有通过内联生命周期通信才有可能。 表格视图是数据访问失败和错误无声消失的地方 场景 :您出差在外的3G连接糟糕,当您意识到应用程序远离加利福尼亚州的高速LTE连接时感觉如何破损时,您会感到羞愧和厌恶。 问题 :通信基于网络的数据加载并启用故障重试对于专业构建的应用程序和UI至关重要。 请记住,这是一个面临连接挑战的移动平台。 如果您的表视图中充满了// TODO:handle error ,则可以尝试以下方法来改善它们 方法 :在数据源中创建数据类型的标准枚举,并让表视图处理每个枚举案例。 这是我的: 您的大多数数据块的类型都是“自定义”,但其他数据块则值得 当数据源通过从模型层读取数据进行组装时,它还可以向您的数据访问对象询问任何相关暂挂请求的状态。 当前正在加载东西吗? 有错误吗? 这是什么错误? 如果数据源对这些问题有任何有趣的答案,则可以使用相应的类型枚举值将数据块组装并附加到其自己的内部数据哈希中。 假设模型层为空,数据访问对象说请求仍在进行中。 数据源可以在加载块或加载错误块后附加相关的错误对象。 您会注意到,我对数据访问服务对象使用了类似的枚举,以便在状态枚举的上下文中轻松地传达状态 当向数据源请求给定索引(路径)处的数据块时,表格视图便能够快速切换所有可能的块类型,并做出相应的响应。 通过在应用程序范围内设置一些简单的加载和重试单元格,并将其注册到表格视图中,处理这些状态便成为样板代码。 也有机会自定义每种情况,但至关重要的是,它提供了一种快速一致的方式来传达这些经常被忽略的状态:加载,加载错误(具有重试能力)和无数据。 视图还可以选择完全忽略这些枚举值,并且数据源(例如,如果它不依赖于加载)可以明确表示从不使用它们。 我的视图控制器严重依赖数据管理器及其返回的块的类型 我构建的标准LoadError单元需要使用Load Error Retry Delegate进行初始化,然后视图控制器将其分派回数据管理器。 您可以看到如何将我们在cellForRowAtIndexPath中使用的相同开关逻辑应用于所有其他表视图委托和数据源协议实现方法。 在viewDidLoad中的单元格注册可实现对每个状态的良好,标准,简单的处理,它位于util中,如下所示: 将简单的可重用生命周期单元格注册到任何表视图 结论 我到处都使用这种模式。 它的维护成本低,这意味着我可以将开发工作重点放在我们要在要构建的表中呈现给用户的产品和UI上。 但这使我充满信心,在连接不畅或数据访问有问题的情况下,我正在构建的应用程序的用户将知道正在发生的事情(正在加载),并有权采取行动(重试错误) 。 永远不会出现这样的情况:他们不得不强制关闭应用程序以重试失败的数据访问,或者来回导航以尝试重新启动某些数据访问。 注意:不要在块类型切换语句中使用默认处理程序。 如果添加新的枚举值,则希望编译器向我提醒我需要添加对新状态的支持的位置,它可以帮助您建立对使用这些数据块的所有方式的信心。 […]

有趣的位掩码

有很多类型检查方法。 您可以将其定义为常量字符串以供日后检查,也可以使用enum进行便捷的方式(这种方式最多可以使用)…但是有一种类型检查的方法,即使用Bitmask 。 本文将引导您深入了解如何在Objective C中使用Bitmask 。 我们可以很容易地看到,Apple在SDK中使用了大量Bitmask ,例如: UIViewAutoresizing , UIInterfaceOrientation … 我们将创建自己的示例,让我们看看: typedef NS_OPTIONS (NSUInteger,PLandayEngineerTeam){ PLandayEngineerTeam_Mobile = 1 << 0, PLandayEngineerTeam_Backend = 1 << 1, PLandayEngineerTeam_Frontend = 1 << 2 }; 我们实际上使用了按位运算符,在这种情况下称为“ 移位” ,因为在此操作中,数字被移动或移位 。 在我们的示例中,数字向左移动。 欲了解更多信息,您可以查看一下有关位操作的信息:https://en.wikipedia.org/wiki/Bitwise_operation 因此,现在我们在Binary中提供示例: typedef NS_OPTIONS (NSUInteger,PLandayEngineerTeam){ PLandayEngineerTeam_Mobile = 1 << 0, // => 00000001 PLandayEngineerTeam_Backend = 1 << 1, […]

Swift,Xcode 8.1,NSTableView,绑定和数组控制器

从iOS开发转向macOS开发时,您理所当然的一件事就是iOS中的表格清晰明了。 UITableViews真正构成了许多iOS体验的骨干-明确定义了与它们的交互,并且对其进行了很好的记录和教导。 macOS和NSTableViews并非如此! 最初,我的印象是,就像在iOS上一样,将只有一种“正确”的方式来制作表格。 但是,在代码内实现和绑定之间,我感到困惑和迷茫。 这篇文章将通过使用绑定对NSTableView进行非常基本的设置。 有很多注释和屏幕截图,特别是因为要管理的屏幕太多….好吧,让我们深入研究! 第1步:准备数据模型 这里没有超级幻想。 让我们从PONSO开始。 类SomeDoctor:NSObject { var variable1:Int = 0 var variable2:Int = 0 var variable3:Int = 0 } 在上面,我们要做的就是创建一个NSObject并实例化一些变量。 请注意这些变量名,因为稍后我们将直接绑定它们(按名称)! 第2步:设置您的NSViewController 再次,这里没有幻想。 让我们创建典型的NSViewController,但是这次要注意创建一个动态类型的数组,如下所示: 类SimultaneousSummaryViewController:NSViewController { … @IBOutlet var arrayController:NSArrayController! 动态var临床医生= [SomeDoctor]() … } “动态”在这里只是意味着编译器将退出并寻找合适的Objective-C编译器来实现。 您可以在此处阅读有关该想法的更多信息。 当我们在这里时,我们还创建了一个NSArrayController引用-这是可选的! 我们严格不需要任何东西,但是制作完成后,您可能会感到不舒服。 步骤3:建立您的NSArrayController 找到您的NSArrayController对象,然后将其拖放到情节提要或xib文件中的NSViewController中。 步骤4:绑定,绑定,绑定! 突出显示您刚刚创建的NSArraryController。 展开右侧面板,然后选择“绑定”选项卡 展开后,请尝试使以下参数与您所拥有的匹配。 在上面,我们所做的是将NSArrayController绑定到NSViewController(明确地)。 现在,我们还将其绑定到我们先前定义的变量,并使该变量可用。 步骤5:绑定您的NSTableView 我们到家了! 将NSTableView拖放到情节提要/ […]

使用Swift探索视觉格式语言

几周前,我开始介绍如何在Objective-C和Swift中使用自动布局的想法,以确保我的应用在所有iOS设备上都能正确显示。 您可以在Interface Builder(IB)中创建约束或以编程方式构建约束。 具有视觉设计的背景,我立即着迷于IB,因为它使我想起了许多设计程序。 实际情况似乎是,构建程序约束的时间往往会被可能与您的项目一起工作的其他人重用和可读性更高。 因此,我很想知道是否可以通过某种方式在视觉上构造程序约束。 使用视觉格式语言输入约束。 视觉格式语言 视觉格式语言允许您使用视觉语法字符串构建程序约束。 想法是文本在视觉上与布局匹配。 这是摘录的Apple文档: 完整的布局线 H:|-[查找]-[findNext]-[findField(> = 20)]-| 让我们分解一下: H :(水平)//水平方向 | (管道)// superview -(破折号)//标准间距(通常为8点) [](方括号)//对象名称(uilabel,unbutton,uiview等) ()(括号)//对象的大小 因此,如果我们要说一句话,我们会说findButton是距超级视图的开头(左边缘)的填充点(空白)为8点,而距findNextButton的开头的填充点为8点。 findNextButton是距findField的开头的8个填充点。 最后,findField的大小至少为20点,并且距超级视图的尾部(右侧)有8个填充点。 上面的代码特别有趣的是,它同时处理(设置)对findButton,findNextButton和findField的所有水平约束。 这里发生了很多魔术,所以我将尽力向您介绍如何在模拟项目中实现此功能的基本示例。 在一个快速的项目中,我们需要向您的超级视图添加一些对象,我们也可以附加约束。 我还喜欢为您的对象添加背景色,以便在测试约束时可以看到它占用的空间: 覆盖func viewDidLoad(){ super.viewDidLoad() //创建四个视图对象以表示我们的超级视图中的元素 让topBar = UIView() 让middleFrameTop = UIView() 让middleFrameBottom = UIView() 让bottomBar = UIView() //设置这些子视图的背景颜色 topBar.backgroundColor = UIColor.grayColor() middleFrameTop.backgroundColor = UIColor.orangeColor() middleFrameBottom.backgroundColor […]

戴夫·托马斯(Dave Thomas)的数据整理卡塔(Kata)的快速解决方案,第2部分

戴夫·托马斯(Dave Thomas)的数据整理卡塔(Kata)的快速解决方案,第2部分 如果您还没有阅读我对Dave数据处理kata的第1部分的解决方案,请首先进行检查。 第2部分要求我们清理分析英超联赛足球(您知道,足球)结果的数据集。 文件football.dat包含2001/2英超联赛​​的结果。 标记为“ F”和“ A”的列包含该赛季每个球队得分和对阵球队的进球总数(因此,阿森纳对阵对手的进球为79球,对阵对手的进球为36)。 编写一个程序,以在“达成”和“反对”目标中差异最小的团队的名字打印出来。 此练习与第1部分非常相似,并且可以重复使用许多原始代码。 这篇文章将重点讨论第1部分和第2部分之间的区别。[GitHub上的完整代码]。 模型 我们需要的是FootballResult模型,而不是WeatherRecord。 在计算/反对增量变量的目标时,我们需要它们的差的绝对值。 这是因为使用WeatherRecord时,最高温度始终高于最低温度,但在这种情况下,任一变量都可以更高。 在将充满字符串的表转换为模型对象时,我还采用了另一种方法。 对于天气记录,可以将所有三个值建模为整数(月日索引,maxTemp,minTemp)。 在本练习中,我们需要一个teamName:String,GoalScoredFor:Int和GoalScoredAgainst:Int。 我选择为我的结构编写一个自定义init,该结构接受三个字符串并将目标字符串转换为Ints。 原因是模型负责将值转换为特定类型。 执行者不应该承担这项责任。 数据变压器 第一个区别是足球数据都不是“脏”的,因此我们可以删除cleanData步骤。 其次,如“模型”部分所述,我们在FootballResult上有一个自定义的init方法,因此我们不需要.convertStringsToInts()方法。 在“天气”数据集中,我们只需要获取前三列,因此我们遍历了所有行,并且对于每行,i .. <3用于获取前三列。 我对此解决方案不满意,因此在这里重新设计以使用flatMap。 #somuchcleaner 静态函数removeUnneededColumns(fromTable表:[[String]])-> [[String]] { 返回table.flatMap {(行:[String])在 返回[行[1],行[6],行[8]] }} .flatMap()最出名的是将数组数组“展平”,从而使[[“ a”,“ b”],[“ c”,“ d”]展平为[“ a”,“ b”,“ c”,“ d”]。 但是.flatMap()也可以映射并返回一个数组,该数组包含的元素要少于传递给它的元素(.map()不能做到的事情)。 在这种情况下,我们将取出需要保留的列的单元格并返回它们。 *快乐的舞蹈* 然后在适当的时候将名称从天气更改为足球,这就是第1部分和第2部分之间的所有差异。正如Dave所建议的那样,我没有偷看kata的第3部分,但我想我们会做点什么更通用。

自动生成的Swift网络模型-JustBinary-中

自动生成Swift网络模型 永远不要再编写网络模型。 下一步 ModelSynchro目前正在积极开发中,仍然可以添加一些很酷的功能。 我一如既往地重视反馈,并鼓励对改进此广告连播的任何想法。 最初于 2018 年4月15日 发布在 medium.com 上。

iOS应用程序非常基础,UIKIT应用程序指出

我应该说,这篇文章对于iOS开发的新手和想要复习基础知识的开发人员来说将非常有趣。 这些应用程序状态在管理应用程序数据和UI时确实起着重要作用。 因为当应用程序处于后台时(即当用户未看到您的应用程序时,即当您的应用程序被另一个应用程序覆盖时,即……),您没有使用特殊的UI或特殊功能。……好的,现在,您明白了我的意思,对 !!! 希望如此😀让我们继续这个话题。 下图是apple为UIKIT应用程序状态提供的图像: 我知道上面的图片并不能说明太多,就像将整个《权力的游戏》打包成一个剧集一样。 让我以非正式的方式解释一下,UIKIT应用程序将处于的状态,以执行您执行的操作。 正在启动:启动应用程序时,UIKIT应用程序将处于“ 未运行”状态。 打开应用程序(应用程序启动后):启动后,点击应用程序图标,它将经历如下所示的应用程序状态: 关闭应用程序:关闭应用程序意味着, 关闭它 暂时,仅当您单击主页按钮时说。 当您打开应用程序时,关闭后:(暂时关闭): 挂起应用程序:挂起应用程序意味着用开发人员的语言杀死应用程序。 当您的应用程序受到其他应用程序的干扰时:例如,当您接到电话时,您正在使用自己喜欢的应用程序。 我知道这些看起来很简单,但是即使是经验丰富的开发人员,也要在状态之间产生混淆,在我研究本文之前,包括我在内的一些开发人员都认为无效状态和背景状态是相同的。 知道所有这些状态非常重要,因为这种知识将帮助您了解何时应该执行以下操作: 开始动画。 如果启用了自动播放,则开始播放媒体文件。 开始以全帧速率更新游戏图形和沉浸式内容。 使所有活动计时器无效。 暂停游戏。 因此,您实际上可以了解这些状态,从而更好地操纵该应用程序,这真是太好了。 那是最终读者,我知道这是一篇简短的文章,但是非常重要,希望您喜欢这篇文章,如果您有任何疑问或想念任何内容,请在below下面进行评论。 朱丽叶编码员签署offff……。