Tag: 编程

Swift 4 Introduction系列1.2 — Swift变量和常量

与其他编程语言类似,Swift也使用常量和变量。 常量是一个名称/标签,用于引用不会随时间变化的所选数据。 常量只能声明和分配一次。 不能在同一程序中重新声明或重新分配它。 但是我们可以多次引用常量。 变量是一个名称/标签,用于引用可能随时间变化的所选数据。 只要重新分配的数据与声明的数据类型相同,我们就可以将其他数据重新分配给该变量。 变量只能在程序中声明一次。 不能在同一程序中重新声明。 Swift的3种基本数据类型是: 字符串表示文本,整数表示整数, 双精度表示浮点数。 Swift鼓励我们使用上述基本数据类型来实现更好的互操作性。 另外,对于无符号整数,我们有UInt ;对于较小的浮点数,我们有Float 。 仅在必要时使用UInt和Float。 除了String之外,我们还具有称为Character的数据类型。 这是一个包含单个字符的数据类型。 最后,我们为布尔值存储了布尔值,布尔值仅存储True或False。 我们使用以下语法声明了常量: 让 = 常量的基本规则: 必须在使用前声明一个常量。 常量只能声明为ONCE 。 声明常量后,就无法在同一程序中再次声明具有相同名称的常量。 常量只能分配一次 。 一旦分配了常数,就无法将其与其他数据一起重新分配。 常量的命名必须遵循命名规则。 在Swift中,建议我们尽可能多地使用常量。 这是为了使代码更安全。 例: 让someString =“这是一个测试” let someNumber = 18273 在上面的示例中,当我们使用值声明常量时,我​​们不需要定义数据类型。 系统将从我们提供的值中推断出数据类型。 通过使用逗号分隔变量,我们可以在单个语句中声明具有多种数据类型的多个变量。 但是,常量和变量不能在同一语句中使用。 例: 设fixed1 = 2837,fixed2 = 7238,fixed3 = 8320,fixed1 固定2 固定3 […]

使用Swift属性观察器清理对象

在上一篇文章中,我们浏览了如何使用委托模式将视图与控制器分离。 今天,我们正在深入研究属性观察者的世界,以了解如何使用它们使对象更易于处理。 什么是财产观察员? 财产观察员观察并响应财产价值的变化。 每次设置属性值时都会调用属性观察器,即使新值与属性的当前值相同也是如此。 – Swift编程语言指南 以上解释几乎说明了一切。 在声明属性观察器时,我们这样做是因为我们有兴趣知道何时更改某个值。 引言告诉我们,“更改”并不一定意味着实际值已更改。 这个想法实际上是观察何时将变量写入其中,这可能是非常有用的事情。 除了观察并通知我们更改之外,我们还可以通过选择willSet (写之前)和/或didSet (写之后)观察者来选择希望在什么时间通知我们。 让我们看一些示例,这可以如何帮助我们清理代码并简化其他想要使用我们的实现的开发人员。 假设我们正在实现一个自定义进度条,该进度条将在您的应用程序的几个地方使用。 它由一个典型的蓝色条组成,该蓝色条随进度进行动画处理。 它还具有一个标签,用于向用户显示进度的四舍五入百分比值。 控制和强制变量的域 为了跟踪我们的进度,我们将使用Double类型的规范化值。 在这种情况下,归一化意味着我们将存储一个数字x,使得0≤x≤1。这种方法具有很多优点,尤其是在处理图形时。 它还负责检查设置的值,以使它们保留在域中。 让我们看看属性观察器如何帮助我们做到这一点: 类ProgressBar { public var progress:Double = 0 { didSet { self.progress = min(max(self.progress,0),1) print(“将新进度设置为\(self.progress)。”) } } } var p = ProgressBar() p。进步= 2 //打印“将新进度设置为1.0” 进步= 0.2 //打印“将新进度设置为0.2” p。进步= -100 //打印“将新进度设置为0.0” 很好 通过使用didSet观察器,我们可以确保进度值始终保持在其范围内。 […]

Swift 5的基本API请求

大家好,今天的文章是有关如何使用Swift 5执行API请求的基础教程。我目前是一名自由职业的iOS开发人员,已完成Udacity的iOS开发纳米学位,并且出于教育目的而编写。 让我们首先在Xcode中创建一个新的单视图项目: 我已经将此项目命名为playingWithRequests 。 让我们看看这个项目的目标: 了解如何使用Swift 5向API发出请求。 了解如何使用URL和URLSession。 了解请求在Swift中的工作方式。 显示来自互联网的图像。 现在,我们已经创建了项目,接下来将图像拖放到情节提要中。 展开图像以覆盖整个视图,然后将内容模式更改为适合方面的外观,如下所示: 通过将图像放在情节提要中,我们可以创建IBOutlet以便在Swift代码中管理图像: 现在,我们已经准备就绪,可以开始我们的项目了。 对于此示例,我将使用在Google上找到的土星图像。 我们所有的代码都位于viewDidLoad()函数内部。 我们将要使用的第一类称为URL ,它使我们可以表示一个URL。 创建此类的实例,然后粘贴我们的Saturn URL的字符串: 现在我们有了URL,我们将要索取数据。 URLSession类可以管理网络请求,让我们使用它向该网络发出请求 。 我们可以使用自己的设置创建URLSession ,但是在本示例中,我们将使用包含默认设置的类调用共享来执行简单的GET请求。 在开始编码之前,我想再介绍一件事。 当我们使用URLSession类时,网络请求称为task 。 记住这一点很重要,因为每次需要与API交互时,我们都会处理任务(请求)。 我们准备创建指向URL的任务,我们将使用类调用dataTask: 我们正在使用URLSession发起对存储在常量imageURL中的URL的请求 。 使用此方法,我们有一个完成处理程序,该处理程序将在遇到错误时帮助我们处理数据,首先检查错误变量是否为nil。 现在,我们可以在视图中显示图像: Swift 5更新:到目前为止,所有代码对于Swift 4都是相同的,但是在继续之前,我想提一下,随着对Swift 5的更新,该库现在包含了一个称为 Result Type的 东西 。 结果类型的工作方式与 可选类型 一样, 但是在这种情况下,结果类型被实现为枚举。 这对于异步任务非常有效,因为在获取数据之前,我们甚至要求成功或失败。 我们不会在这里看到这个,以后我将为此主题编写一个特定的教程。 如果我们现在运行项目,您将不会在应用程序中看到任何内容。 我们具有请求的代码,但是我们需要使用方法调用resume()来运行任务: 现在,如果我们运行我们的应用程序,您将看到一个空白页。 按下cmd + shift […]

如何使用弱引用和无主引用来中断引用周期?

#第二种情况 当一个属性被允许为nil而另一个属性不能为nil 。 在这种情况下,无主引用最适合打破潜在的强引用周期。 什么是无人参考? 例如,使用未拥有的引用的生存 期比其他实例更长或更长 。 这意味着引用为“无主”的实例将始终具有值,因此始终将其声明为非可选的。 ARC永远不会将无主引用设置为nil,即使其引用的对象已释放。 因此,您应确保不要释放未拥有的引用,否则,如果尝试访问它,则会导致运行时错误。 例: 让我们考虑一个客户和BankAccount的示例。 在这里,Customer和BankAccount之间的关系与Person and Appartment示例略有不同。 客户可能有也可能没有银行帐户,但银行帐户将始终与客户关联。 让我们看看这将如何导致潜在的强参考周期。 客户类别{ 命名:字符串 var account:BankAccount? init(name:String){ self.name =名称 } deinit {print(“ \(name)正在被初始化”)} } Class BankAccount { 让号:UInt64 让客户:客户 init(数字:UInt64,客户:客户){ self.number =数字 self.customer =客户 } deinit { 打印(“正在取消初始化具有帐号\(number)的BankAccount”) } } 如您在上面的代码中所看到的,我们已经在BankAccount类中将客户属性设置为常量或非可选,因为我们知道银行帐户在客户中将始终具有客户和可选帐户属性,因为客户可能拥有或可能没有银行帐户。 var harry:客户? 哈里=客户(名称:“哈里”) harry?.account = BankAccount(号码:1323243214214,客户:哈里!) 哈里=零 如果运行上面的代码,则不会看到任何deinit方法被调用。 […]

Swift的反应式编程第1部分

如果您是iOS开发人员,那么您应该已经听说过RxSwift。 这是Reactive编程的快速版本。 RxSwift功能强大且有效,它将为您完成代码中的所有工作,并使您的开发人员生活变得轻松。 不相信吗? 比起您,我可以检查一下此介绍性的Reactive Programming,与我me —> 新手的Reactive编程 。 RxSwift漫游以下条款: –观察员与观察员 – 学科 –运营商 –调度程序 让我们开始一个个地探索所有这些东西。 可观察者和观察者: “事件A发出一些数据,订阅事件A的其他事件(例如事件B和事件C)将获得该发出的数据。 发出数据的事件(在这种情况下为Event-A)被称为“ 可观察的 ”或“ 可观察的序列 ”,并且接收到发出的数据的所有事件(在这种情况下为Event-B和Event-C)被称为“ 观察者 ”。 这是理解Observable的最简单定义。 可观察的数据可以是连续的,也可以在多个实例中发出。 观察者可以依次接收所有这些实例。 让我们检查下图: 这是上图快速显示编码的方式: let observableA = Observable.of(1,2,3,4,5,6)//创建可观察的 让observerB = myFirstObservable.asObservable() //订阅Observable readerB.subscribe {事件在 打印(事件) } 输出: 下一个(1) 下一个(2) 下一个(3) 下一个(4) 下一个(5) 下一个(6) 已完成 在这里,观察者B不断获取来自A的数据。相同的基础也将适用于其他观察者(C和D)。 您可能会对上面的输出中的“下一个”和“已完成”这两个术语感到好奇。 让我们检查一下。 可观察的生命周期: 可观测值包括三个主要事件: […]

让我们为Xcode开发人员优化使用终端的工作。

每个iOS开发人员通常都必须通过Terminal处理需要完成的事情: 使用git ; 通过Fastlane为客户上传版本; 通过Carthage,Cocoapods或SPM等更新依赖项。 最近,我经常不得不在不同的Xcode项目之间切换,并且每次我必须在终端中更改到特定项目的路径时,都不得不切换。 我很累了! 我想有机会使用已指定的路径直接从Xcode打开终端。 🤔如果您有同样的感觉,请继续阅读! 首先 ,我们需要创建一个具有以下主体的脚本: 为此行为选择一个可识别的名称,设置快捷方式,选择“ Run复选框,然后选择先前配置的脚本。 您只需要配置一次即可,它适用于所有项目。 🎉 谢谢阅读! 希望您喜欢我的终端机优化技巧。 如果您不得不面对相同的问题,但以不同的方式解决了该问题,请在下面的评论部分中分享您的解决方案。 🙏 蓬松的iOS工程师。 被动式开放源代码爱好者和保留周期检测器🙂 还要检查我有关编程,Twitter和开源项目的电报频道:

Swift中的设计模式:装饰器模式

欢迎来到一系列致力于学习设计模式的文章。 尽管许多想法与代码无关,但我们的目标是向您展示如何在Swift中实现它们(在撰写本文时为Swift 3.0)。 每个帖子彼此独立,所有项目代码都可以 在Git上找到 。 想象一下,您在苹果公司工作,而您要负责设计苹果网站的后端。 我们特别感兴趣的是该站点的MacBook订购功能。 尽管只有3款MacBook(在撰写本文时为MacBook,Air和Pro),但MacBook的组合数量会大大增加。 从软件设计的角度来看,用于订购过程的最明显的OOP设计风格可能是继承(多态)。 您将从基类(例如MacBook)开始,它将包含与每个MacBook相关的各种属性(即成本和说明)。 一对一的示例如下所示: 那很棒。 但是考虑一下苹果网站上实际有多少种MacBook组合? 我还没有完成数学运算,但是它必须在100年代。 按照这条路线,您将得到一个看起来像这样的设计: 它开始显得凌乱。 对于每个模型,您需要添加一个新的子类。 如果价格变动怎么办? 每个受价格变化影响的模型都需要更新,而这将变成一大堆麻烦。 装饰器模式在这里成为自己的特色。 它允许我们在运行时向对象添加其他要求。 我们可以使用用户在订购时选择的所有其他功能来“装饰”我们的基本MacBook类。 它遵循“开放-封闭”原则,即是的,对象应该是可扩展的,但不能,您不能更改现有代码(以CocoaPods为例)。 Decorator模式确实使用继承,但是以一种自然的,更有限的方式。 这样可以确保将来扩展系统不会像上图那样结束。 您仅需使用少数子类,就可以进行MacBook所需的100多种定制。 看起来像什么 装饰器模式包含一些基本组件,我们在运行时对其进行了扩展,并用装饰器类进行“装饰”。 在MacBooks的情况下,核心组件将是MacBook(在本示例中,称为MacBook Regular,以免引起混淆!),MacBook Pro和MacBook Air。 这些都将遵循相同的协议,并且能够覆盖协议中的属性,从而赋予其独立性(即,每台MacBook的成本不同)。 装饰器将从装饰器类继承,该装饰器类符合基本协议。 装饰器类包含基础组件的实例,我们将其用于将核心组件包装在装饰器中。 这是一个大致的示意图: 当我们使用MacBook示例进行总结时,您开始了解装饰器模式的工作方式: 它在代码中的外观 首先,在Xcode中创建一个新项目。 我们不会在UIKit中碰任何东西,因此创建一个macOS Terminal项目。 这些类都不复杂。 让我们从所有对象与以下对象交互的基本MacBook类开始: 这只是说所有符合MacBook协议的对象都应包含返回正确值类型的成本和描述项。 所有的ConcreteComponents都符合它,如下所示: 它们扩展协议属性并返回自己的值。 接下来,我们看一下MacBook Decorator。 该类符合MacBook协议,这意味着我们可以返回传递给它的MacBook对象的成本和描述。 这将是所有装饰器都继承自的类: 我们的装饰器是从此类继承的,这意味着它们能够添加自己的单独成本,并添加到传递给它的MacBook实例的描述中。 它们看起来像这样: 完善。 现在,我们要做的是模拟MacBook的自定义。 […]

一个用于String和HTML的Swift扩展

收到的最常见的每日请求之一是从后端管理html字符串,以在UILabel中正确呈现它们。 在大多数情况下,iOS应用程序需要与Web应用程序共存,与UILabel相比,Web应用程序可以更有效地解析HTML。 在NSAttributedString彻底改变游戏规则之前,所有这些都是真实的。 UILabel对象还可以在其名为attributedText的属性中接受特定值: 让aLabel = UILabel() 一个标签。 attributedText = NSAttributedString(字符串:“你好,世界!”) 显然,仅将HTML文本作为此属性的值是不够的…否则就没有理由写这篇文章了。

Swift:在视图之间传递数据

อกส่งากส่ง数据📲นไปใช้ใน้าถัดไปด้วยต้องทำไงอะ🤔 1.第一种方法-通过Segues传递数据 ส่ง数据โดยใช้ Segues …。 แล้วไอsegueนี่คือไร? ู้จักอนอื่นต้องรcomponent导航控制器ก่อน导航控制器คือiOS组件หนiOSแอพพลิเคชั่นมันจะถูกใช้เพื่อสร้าง界面หรือviewซึ่งมีการเปลี่ยนแบบเป็นลำดับชั้นไม่มีการข้ามไปข้ามมามมาเช่นแอพContacts /设置/等等แบบนี้! …。 什么是segue? 首先,您必须了解导航控制器导航控制器是iOS应用程序中的UI组件。 它为分层内容提供了向下钻取界面,例如Contacts / Setting / Etc应用程序(如下面的GIF)。 塞格 storyนStoryboardปกติ场景จะเป็นตัวที่ใช้อ้างถึงส่วนที่ประกอบอยู่บนหน้าจอจะคิดง่ายๆว่าเป็น视图控制器ก็ได้และsegueจะมีลักษณะเป็นลูกศรที่แสดงถึงการเปลี่ยนจาก场景หนึ่งไปยังอีก场景(过渡)โดย公交车,模态 Segueสามารถประยุกต์ใช้ได้หลากหลายเช่นเปลี่ยนไปใช้กับCollectionViewหรือTableViewเป็นต้น 在情节提要中,场景是指屏幕上的内容。 Segues位于两个场景之间,如箭头所示。 它代表从一个场景到另一个场景的过渡。 两种常见的过渡类型是“推”,“模式”。 您还可以调整定序以与其他视图一起使用,例如CollectionView或TableView。 第1步-嵌入导航控制器 คลิกที่视图控制器(根视图) 单击视图控制器(根视图),然后 编辑器 -> 嵌入 -> 导航控制器 第2步-创建Segue กด控制แล้วลากจาก按钮ไปหา第二视图เลือก过渡ตามที่ออกแบบมา 按Control +拖动按钮到第二个视图,然后按设计选择过渡。 步骤3 —设置Segue的标识符 Appตัวหนึ่งส่วนใหญ่ก็อาจจะมีการใช้งานมากกว่า1 sequeจึงจำเป็นต้องระบุ标识符ลงไปด้วยเพื่อที่จะทราบว่ากำลังใช้sequeตัวไหนอยู่(ตัวอย่างดู步骤4) 有时,一个应用程序中存在多个问题。 因此,有必要为以后的实现定义seque的标识符,以便让您知道要实现的seque(第4步中的示例) 第4步—覆盖函数为定序做准备 seceneกใช้ืืกใช้seque 函数准备prepare ีีกก่ที่จะไปสู่ที่จะไปสู่เพื่เพื่จัดกื่ื่มๆแล้วแต่จะืื 当一个正六边形更改为另一个正六边形或使用Seque时,在更改为另一个视图后也将调用“准备”功能。 调用“准备”功能是为了让您准备数据等。 准备(针对segue:UIStoryboardSegue,发件人:是吗?){ } 2.第二种方法—使用UIStoryboard จับ第二个视图มา分配值ดื้อๆเลย 使用UIStoryboard直接设置变量 第1步-设置情节提要ID 第2步-创建变量以引用SecondViewVC […]

递归迭代:Collat​​z猜想(快速4)

本周,我被要求研究Collat​​z猜想,并编写一个函数,该函数确定达到给定输入达到1所需的步骤。Collat​​z猜想以20世纪初德国数学家Lothar Collat​​z命名。 猜想背后的主要思想是,对于任何给定的数字n (即12),如果给定的数字是偶数,则您将是该数字的一半。 如果是偶数,则继续将结果数减半。 如果不是(意味着,如果数字为奇数),则将奇数乘以3并加1。继续应用这两个运算( n * 2或3 n +1),直到n = 1。 为了显示: 如果是偶数,我将被2除。如果是奇数,我将被3乘以加1。我继续这样做直到得到数字1。 上面,我编号了到达1的步骤。它花费了9个步骤。 在下面,我将研究如何计算代码的步数(当然是Swift!)。 注意:有时我会像“ Colletz”那样拼写“ Collat​​z”,对不起! 当n = 12时,无需递归即可运行此功能花费了0.009045888秒。 当n = 12时,使用递归运行此函数在其上次迭代中花费了0.000402969秒。 请注意,在第一次调用中,它花费了0.008834584秒,这比我编写的没有递归的第一个函数要少。 我希望您喜欢使用DispatchTime,并将带有for循环的函数重构为具有递归的函数,从而对Collat​​z猜想有更多的了解。 请在下面享受一点Gosling / Culkin递归。 资源: DispatchTime –调度| Apple开发人员文档 创建相对于系统时钟的时间,该时间自引导以来开始计时。 developer.apple.com