Tag: 编程

使用计算属性和惰性var之间的陷阱

惰性存储的属性是直到首次使用才计算其初始值的属性。 您可以通过在声明之前编写lazy修饰符来表示一个惰性存储属性。 除了存储的属性外,类,结构和枚举还可以定义计算的属性 ,而实际上并不存储值。 相反,它们提供了一个getter和一个可选的setter,以间接检索和设置其他属性和值。 编码一段时间后,您的大脑可能会告诉您它们是相同的。

Swift中[无主的自我]和[弱的自我]之间的区别

在Twitter上关注我: @ kiranjasvanee 在开始深入研究无主且虚弱的事物之前,让我们先谈谈关于ARC的一些知识。 弧 当然,许多人都知道ARC(自动引用计数),当您创建任何类的实例时,它都会分配一块内存来存储有关该实例的信息。 当对象的引用计数等于0时,它将释放内存,因此其他对象可以使用同一内存。 那么,任何对象的引用计数如何变为0? 当没有任何变量指向该对象的引用(内存地址)时,这很简单。 关于保持对象引用的变量数量是该对象的引用计数。 好吧,这是一个基本概念,可以了解有关ARC的更多信息-Swift.org语言指南ARC 无主与弱 简单来说,“无主”和“弱”的工作方式相同,可以解决内存管理的保留周期问题。 两者都不会牢牢抓住它所引用的实例,在门后面都不会增加被引用对象的保留计数。 要了解有关保留周期的更多信息,请浏览相同的文档-Swift.org语言指南ARC。 那么,有什么区别呢? 无主引用不能为零,弱引用可以为零。 听起来很酷,但是实时有什么不同呢? 让我们通过示例来理解这一点。 从这里下载演示项目,如果您只是想了解这个概念,可以不用演示项目就可以继续。 演示中的内容-我们有两个控制器,一个是ViewController ,第二个是UnownedVsWeakViewController 。 可以通过URLSession调用从UnownedVsWeakViewController服务器下载图像。 我从ViewController -> UnownedVsWeakViewController ,然后立即导航(弹出)以了解在UnownedVsWeakViewController已经弹出时,在某些情况下,如[unowned self] UnownedVsWeakViewController [unowned self]或[weak self] ,闭包是如何反应的。 推送到UnownedVsWeakViewController并立即弹出,断点激活后检查调试内存图。 UnownedVsWeakViewController中仍然存在UnownedVsWeakViewController ,而您已经从UnownedVsWeakViewController弹出了。 这只是一个闭包调用,如果有很多闭包完成,您将最终将控制器保存在内存中。 错误的编码方案。 2.让我们尝试通过[weak self]实现这一目标 推送到UnownedVsWeakViewController并立即将UnownedVsWeakViewController弹出,一旦激活断点,检查调试内存图。 UnownedVsWeakViewController中不存在UnownedVsWeakViewController ,当您从中弹出时,它会立即释放。 注意: [weak self]无法阻止完成调用或在完成块内执行语句,只有在self不为nil时,它才会执行那些语句。 不要将自身包装在块中,如果自身为零,它会崩溃。 self !.imageView.image = UIImage.init(data: data!) 3.使用时间[unowned self] […]

字符串(不是理论上的)更新

考虑到我无法购买Apple提倡的许多新配件,我将讨论让Swift 4感到兴奋的一些更新。 如果您有Apple开发人员帐户,请随时下载Xcode的新测试版,这将使您可以使用Swift 4。 字串: 没有人喜欢被串在一起。 如果您从一开始就善于沟通,要么是朝着某个方向前进,要么是建立一种无拘无束的情境。 在当今的现代约会中,似乎我们把Strings做错了,并最终试图纠正这一点。 迭代: 我最终可以访问字符串对象的每个字符,而无需访问characters方法! 数数: 没有什么比自动计数您的字符计数要好了。 我终于可以再次从Strings中受益,进行收集处理。 您是否曾经使用过一个字符串并且只想删除第一个字母? 好吧,现在您可以放下它,就像它很热一样。 相反: 此外,能够访问您的字符串字符并立即反转它们是改变游戏规则的人。 在解决与字符串相关的问题时,我常常不得不依靠能够实现这些方法所能实现的扩展。 这更加直观,将字符串作为序列/集合返回到一个值得尊重的地方。

工厂模式

工厂模式是一种封装创建对象的实现细节的方法,其中包含一个公共的基类或接口。客户端通过该公共接口接收创建的对象而无需担心其背后的复杂性。 工厂模式将创建对象的实现细节与公共接口分开。 例如,有一个Job门户,它向各种技术领域的求职者发送求职说明电子邮件。 首先,我们将创建接口(或协议),用于根据求职者的技能或兴趣向其发送定制的电子邮件。 现在,我们将创建一个模型对象,该模型对象将用于创建详细对象。 接下来,我们将创建几个遵守JobSeekerProtocol的模板对象 我们需要模板来将工作电子邮件发送给iOS开发人员,Android开发人员,Java开发人员和Windows开发人员。 我们希望对客户端隐藏这些对象的详细信息,而只公开仅了解协议的客户端接口。 现在让我们创建一个工厂,该工厂返回一个符合JobSeekerProtocol的对象,我们的客户将使用该工厂通过传递联系人对象来获取所需的对象。 我们的工厂隐藏了所创建对象的实现细节,因为当我们想对所创建的对象执行任何操作时,我们将使用接口方法。 我们可以在不更改客户代码的情况下从工厂更改工厂对象的实现。 现在,我们可以根据他们正在寻找的工作类型向他们的联系人发送自定义的电子邮件。 只要我们的界面不变,我们就可以根据需要扩展示例,而不必更改客户端代码。 这意味着我们可以添加新的职位和求职者对象,以将自定义的电子邮件发送给新的联系人类型。 工厂模式还遵循抽象,从而导致可重用的代码。 https://github.com/piyush23dez/FactoryPattern

Como Programar en Swift con iOS 12(版本)

Hola,他在讲课后与学生们建立了联系,在讲课的过程中没有讲解,并且在课程中没有任何帮助。 第1部分->介绍los lo que veras en los教程 。 第2部分-> Primeros pasos en una app Parte 3-> Creando tuprimera应用程序! Parte 4-> Felicidades,有creado tu primea应用程序! 💪 第5部分> Hablemos de Playground🎮 第6部分-> 注释和 注释 从实践中获取经验的教程。 教程由Muchas gracias por seguir mi提供,而espero que sean de gran ayuda para ti。 没有任何人愿意像“拍手”或“像拍打一样”那样去做客。 更多信息,请联系我们。

使用Xcode构建您的第一个应用程序

确保您的选项未选中,并且语言为Swift。 导航Xcode 我们将工作的四个主要部分是导航器,编辑器,调试区域和实用程序区域。 如您所见,我们的项目文件位于导航区域中。 我们应用程序的界面按钮将在Storyboard.swift进行设计。 文件和我们的Swift代码将保存在ViewController.swift 。 Xcode已经为我们提供了View Controller项目文件以开始使用。 现在,不必担心AppDelegate.swift或其他文件。 创建UI设计 尽管您可以通过编程方式对界面进行编码,但我认为在情节提要中进行工作是一种更直观,更有趣的方式来了解正在发生的事情。 因此,我们将在Xcode的故事板(用于存储用户界面)中使用情节提要。 仍在导航区域中的HelloWorldApp文件夹下,单击Storyboard.swift 。 添加对象元素 继续并单击对象库,如下图所示,或(Shift + Command + L)。 继续,在画布上添加一个“ 按钮 ”和一个“ 标签 ”。 从上面的对象库中放置并拖拽Button和Label对象。 使用右面板顶部的“ 显示属性”检查器图标,将按钮的文本,大小和字体更改为“显示问候”,添加背景色,并将标签重命名为“ Hello World”。 添加约束 我们需要添加约束,以使其在旋转设备或在不同屏幕尺寸上使用时保持在原位。 选择元素后,您将要单击下面的图标以添加约束。 将UI元素连接到代码 现在,我们已经完成了UI,现在让我们编写代码以建立与UI的连接。 要并排查看两个文件,请单击助手编辑器以在项目导航器中打开ViewController.swift文件。 现在,我们需要在“显示问候”按钮与View Controller.swift文件之间建立连接。 在Storyboard.swift文件中,单击“ Hello World!”标签。 在单击键盘上的CTRL按钮的同时,单击并将标签拖动到ViewController.swift文件。 确保标签是连接插座,并标记为“ helloWorld”。 使用“显示问候语”按钮执行相同的操作,除了确保将连接更改为“动作”。 它看起来像这样: 完成代码 测试该应用程序之前的最后一步是将以下代码放入您刚刚添加的toggleGreeting(_ sender: Any)方法中,该方法在未被使用时将隐藏“ Hello World!”问候: helloLabel.isHidden = […]

为抽象类型聚合编写扩展函数

Swift本身是一种静态类型的语言 对于静态类型的语言,编译器在编译时必须具有有关类和函数的所有信息。 这意味着所有变量,常量和函数必须事先声明其类型。 但是,具有可以作用于不同类型的一种功能或一种方法仍然是可能的。 为此, Swift提供了强大的功能Generic 。 通用代码启用可以与不同类型一起使用的功能和类型 通常,功能通常是一段可重用的代码,用于执行单个相关的动作。 因此,函数的普通形式如下: func function_name(parameters: declared_type) -> return_type { //… Code here return typed_constants } 传统上,我们可以为相同目的单独创建函数以与不同类型一起使用。 但是,这意味着我们为每个唯一的类型声明基于相似的模式生成代码。 而且它以某种方式违反了以一种干净的方式进行编码并且免维护,这始终是程序员的目标和原则。 有鉴于此,我们需要一种抽象的方式,并能够以清晰的形式表达其意图。 这就是我们所谓的Generic 。 让我们从可以以不同类型重用的通用实体开始 通用实体必须具有类型参数。 下面的“ T ”代表通用实体最终将使用的任何类型。 struct GenericStruct { var someThing: T } // After above manner, GenericStruct can be constructed and parameterized over different types by adding […]

查找并返回Swift中给定字符串的所有出现范围

在谈论字符串模式匹配识别问题时,您想到的第一个想法可能是Knuth–Morris–Pratt算法。 但是,在本文中,我想介绍一种基于range(of:options:range:locale:)的更直观的方法,该方法是Swift标准库的一部分。 多次返回第一次出现以收集所有它们 如果您查找Apple Developer Documentation,则会发现对函数range(of:options:range:locale:)的描述,该描述与下面的引用相同。 使用给定的语言环境(如果有),在给定的选项的约束下,找到并返回给定字符串在给定字符串范围内第一次出现的范围。 是的,它只返回第一次出现 。 因此,为了实现我们的目的,我们需要构造一个while循环以迭代接收器中给定字符串的所有出现。 参考代码段将类似于以下代码块。 并请注意,还添加了偏移量以减少每次迭代中的范围长度。 因此,实际上,每个循环的位置基本上都是基于上一次迭代的上限。 extension String { var indices = [Int]() while let range = range(of: occurrence, range: position..<endIndex) { to: range.lowerBound) let offset = occurrence.distance(from: occurrence.startIndex, guard let after = index(range.lowerBound, limitedBy: endIndex) else { } } } 将索引转换为范围 在将上述代码应用于实际情况时,有时返回所有索引不足以进行文本编辑中的查找和替换所有操作。 因此,转换助手可以帮助生成范围数组,该数组更易于处理子字符串。 extension String { let […]

与Objective-C Swift代码兼容

(本文最初是用俄语撰写的,并在此处发布。) 尽管Apple已向我们提供了有关如何在Objective-C应用程序中使用Swift代码的详细文档(反之亦然),但在此方面还远远不够。 当我需要为Swift框架提供与Objective-C的兼容性时,Apple文档提出了更多问题,然后给出了答案(或者至少留有很多空白)。 密集的搜索证明该主题的照明效果很差:有关StackOverflow的几个问题和一些介绍性文章–这就是我所发现的全部。 本出版物是对找到的信息和我自己的经验的概括。 所描述的所有方法并不能声称是一个很好的实践,它们只是提供了一种解决问题的方法。 TL; DR。 为了在Objective-C中使用Swift代码,必须牺牲一些Swift功能,并为原始的Swift代码编写一个包装程序,该代码将不使用不兼容的功能(例如结构,泛型,枚举关联值,协议扩展等)。 所有包装器类都必须继承NSObject。 开始 因此,我们有一个基于Objective-C的项目以及一些想要在其中使用的Swift代码模块。 例如,它可以是在CocoaPods的帮助下添加的Swift框架。 像往常一样,我们向Podfile添加依赖项,运行pod install ,打开xcworkspace文件。 要使Swift框架可见,就不需要使用整个模块(就像我们在Swift中所做的那样)或单个文件(就像我们在Objective-C中所做的那样)导入。 必须导入的是一个名为-Swift.h的文件-这是自动生成的头文件,该文件是Objective-C代码与Swift公共API之间的连接链接。 看起来像这样: #import“ YourProjectName-Swift.h” 在Objective-C中使用Swift类 如果您可以立即使用Objective-C中的某些Swift类或方法,那么您很幸运:有人为您解决了兼容性问题。 事实是,Objective-C仅消化NSObject继承者和属性的公共API,初始化程序和方法必须由@objc属性标记。 处理自己的代码时,您始终可以继承所需的任何内容并添加任何属性。 当然,在这种情况下,您甚至可以用Objective-C编写,对吗? 因此,最好专注于他人的代码。 我们可以做什么? 写包装纸。 例如,考虑以下Swift类: 公共类SwiftClass { 公共功能swiftMethod(){ //此处执行。 } } 我们创建自己的Swift文件,导入外部Swift模块,创建NSObject继承类,并在该类内部创建想要的Swift类型的私有属性。 最主要的是一个通过属性调用原始Swift类型方法的方法: 进口基金会 导入SwiftFramework 公共类SwiftClassObjCWrapper:NSObject { 私人让swiftClass = SwiftClass() @objc 公共功能swiftMethod(){ swiftClass.swiftMethod() } } ( NSObject和@objc属性都可以从Foundation获得。) 显然,我们不能使用相同的名称。 但是我们可以使用原始名称将包装器API公开给Objective-C: @objc(SwiftClass) […]

XCode模板

最终没有在任何地方存在的概念。 不适用的形式或形式上的法律要求。 在此之后,我们将发布XCode或hacer plantillas delcódigoque mas usamos的常规模板。 1. Nuevo模板 Vamos a crear un nuevo模板llamado CustomTemplate ,para vamos a crear un contenedor de la plantilla。 由ejemplo en el escritorio提供。 Para crear ese contenedor creamos unaveta normal y de nombre le ponemos CustomTemplate.xctemplate 2.自定义类 尤其要注意的是植物生长的裂缝。 Nuestra plantilla vamos,lamarle CustomClass和seres Swift,以及poder tener或no XIB。 Para ello creamos dos carpetas: […]