Tag: 教程

简单的Swift事物:Swift中的参数标签

快速调用函数时何时以及何时不编写参数说明 TLDR; 这些是编写参数标签的准则: 初始化函数的所有参数都应具有外部参数标签。 除第一个参数外,其他函数和方法的所有参数都应具有外部参数标签。 长版 因此,您声明了只有两个成员的MyClass : 类MyClass { var计数器:整数? var anotherCounter:整数? } 然后,声明一个名为的初始化函数: 初始化(第一个:整数,第二个:整数){ self.counter =第一; self.anotherCounter =秒; } 还有一个名为的自定义方法: func myFunction(counter:Int,anotherCounter:Int){ 打印(“打印此”); } 每当我们调用init方法时,都将需要其参数的所有描述。 例如。 var myObject = MyClass(第一:5,第二:5); 但是,要调用其他函数,我们不会在第一个参数中使用描述。 例如。 myObject.myFunction(5,anotherCounter:10); 但是,如果您决定无论如何都不会写描述,则可以使用_关键字将其隐藏。 函数的定义更改为: func myFunction(counter:Int,_ anotherCounter:Int){ 打印(“打印此”); } 然后,函数可以称为: myObject.myFunction(5,10);

Swift中的闭包:续集

自从我开始学习Swift闭包以来,我发现自己实际上正在寻找它们,并尝试将它们更频繁地注入我的作品中。 我本着同样的精神涉足函数式编程 不可避免地 高阶函数 。 函数式编程已成为更高级的编程方法之一,它已成为摆在桌面上的一席之地。 但是,这与功能编程无关。 这是关于我对闭包的学习; 它们如何在高阶函数中使用,以及扩展后,它们在函数编程中的作用。 如果您尚未探索函数式编程,建议您这样做。 将您的🐽放到那里,看看是否喜欢它。 你知道他们在说什么,没有有害的知识。 本文主要借鉴了Ray Wanderlich的本教程,主要是因为我发现它很好地解释了并且阅读起来很有趣。 Ray Wanderlich的教程难道不是很棒吗? 🙌 要继续学习本章,您需要基本的闭包知识。 不是你的茶吗? 不用担心,当我的学习也不是我在这里喝茶的时候,我就写下自己的学习内容。 在进行函数编程之前,让我们回到舒适的区域。 这是我们最常使用的东西。 您有一个列表,想要遍历该列表并执行某些操作。 您将做什么,请召唤for循环! 这就是所谓的命令式编程 。 这看起来很整洁,您了解它并且很容易编写。 那么,为什么要解决未损坏的问题呢? 这就是为什么! 释放🐉,我的意思是声明性的! 上面的示例实际上只是一行代码,它很简洁,即使现在看起来不太像,但编写起来却容易得多。 这些只是我们看到的一些优势,我们将在进行过程中探讨其他更大的优势。 我有你的兴趣吗? 现在我们可以尝试定义什么是功能编程。 函数式编程是谁? 函数式编程是专注于数学计算并避免状态和可变数据的范例。 一旦避免了状态数据和可变数据,我们将转向高阶函数来填补空白。 与定义高阶函数一样,这似乎是一个好时机。 高阶函数 高阶函数是接受其他函数作为参数,可以返回一个函数或同时返回两者的函数。 当我们在这里探索闭包时,我们提到闭包被称为高阶函数functions。 上面有一个小问题,我们将使用它来查看几个高阶函数。 这是一个书店模型。 有各种组成部分的书籍和书籍清单。 地图 这是一个闭包 , 接受一个函数作为其参数,并在将函数应用于数组中的每个元素后返回 长度相同 的数组 。 问题1 我们希望在我们的小书店中获得所有书名的列表。 我们该怎么做呢? 势在必行? […]

在Swift 4中使用Segue

您在这里或更准确地说,是我写这篇文章的事实,向我们展示了我们过去如何视这些小事情为理所当然。 谁知道按下按钮并使iPhone进入下一个屏幕将在引擎盖后面做很多工作🙂 自从我开始开发iOS应用程序以来,手机上的每个应用程序都令我感到惊讶……也许是,这种惊奇促使我了解更多信息。 “他们到底是怎么做到的?”“太酷了!。我想知道我是否能够做到这一点..” 诸如此类的好奇心和问题是学习任何事物的动力之一。 如果您对某些东西感兴趣,那么您对它不了解的东西就会消失……只是为了让您有机会了解它。 这个序言已经足够了,让我们来谈谈您来到这里的事情… 从一个ViewController(屏幕)到另一个ViewController,执行简单的“ Segue”移动需要遵循哪些步骤。 步骤1:按住Control键并从“按钮”拖动到所需的VC,然后松开。 现在,根据您的要求选择“显示”或“显示详细信息”选项。 第2步:点击Segue箭头,并为其“标识符”命名 步骤3:将您用于创建序列的按钮链接为IBAction。 步骤4:在该IBAction中,编写以下代码: 选项1:如果您不想发送任何数据,那么下面的行就足够了。 performSegue(withIdentifier:“ goToNextViewController”,发送者:self) “ goToNextViewController”与我们为segue命名的名称相同,还记得吗? 选项2:如果您确实想在ViewController之间传递数据,则在此IBAction方法的下方(和外部),编写以下代码行: 覆盖func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 让destinationVC = segue.destination作为! SecondViewController destinationVC。 →您可以在这里访问另一个VC中的变量/属性…,这就是开始在两个VC之间传递数据的方式。 } 这就是现在的人们, 希望这可以帮助, 温暖的问候, Hiten…

iOS 11中拖放功能的简单示例

我们简要地看到了苹果几个月前在其WWDC中引入的拖放功能。 今天,我们将通过示例代码对功能进行更深入的了解。 我们将看到如何在视图和表视图中实现拖放功能。 创建一个新项目并添加2个选项View和TableView。 当用户选择“自定义视图”选项时,导航至CustomViewController并设计如下所示的UI。 在此屏幕中,我们将执行从一个imageView到另一个imageView的拖动,以及从一个textView文本到另一个textView的拖动。 首先,为imageView启用用户交互。 然后,我们需要使用DragInteraction委托为ImageView设置一个Drag交互。 仅在委托中,我们将指定要拖动的DragItem。 dragImageView.isUserInteractionEnabled = true dropImageView.isUserInteractionEnabled = true dragImageView.addInteraction(UIDragInteraction(delegate:self)) dragTextView.addInteraction(UIDragInteraction(delegate:self)) 准备好拖动对象后,将调用以下委托方法。 func dragInteraction(_交互:UIDragInteraction,itemsForBeginning会话:UIDragSession)-> [UIDragItem] 我们将拖动要拖动的imageview和textview,因此代码实现如下。 func dragInteraction(_交互:UIDragInteraction,itemsForBeginning会话:UIDragSession)-> [UIDragItem] {如果让textValue = interact.view为? UITextView {让provider = NSItemProvider(object:textValue.text!as NSString)let item = UIDragItem(itemProvider:provider)返回[item]}如果让imageView = interact.view为? UIImageView {保护let image = imageView.image else {return []} let provider = NSItemProvider(object:image)let item = UIDragItem(itemProvider:provider)return [item]} return […]

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.实际的生产示例: 网页下载进度 👨‍💻 […]

征服ReactiveSwift:属性(第5部分)

欢迎来到征服ReactiveSwift系列文章的第5部分。 在上一篇文章中,我们学习了如何创建,启动和观察SignalProducer 。 在本文中,我们将讨论Property和MutableProperty的概念。 定义 属性 Property是一个可观察的容器,只要更改其值,它就会发出其值。 它符合PropertyProtocol , PropertyProtocol本身具有以下属性: value :代表当前值 producer :一个SignalProducer,它发送当前值以及随后的更改。 当属性取消初始化或没有进一步更改时,此操作完成。 signal :一个信号,它发送随后的更改, 而不是当前值。 当属性取消初始化或没有进一步更改时,此操作完成。 有什么用? 当我们只需要处理值而不是错误时,这是​​非常有用的。 让我们考虑上一篇文章中的示例。 每隔五秒打印一次时间信息,间隔五十秒。 为此,我们创建了一个SignalProducer,如下所示: 请注意,这里的错误类型为NoError ,这意味着我们不在这里处理错误。 当我们可以将其包装在Property中时,这是一个很好的用例。 因此,让我们定义一个Property 。 在这里,属性的初始值为’0’,随后的值由signalProducer返回。 如前所述,Property具有signal和producer属性,两者都可以观察到,但主要区别在于信号不会发出当前值,只有随后对该值进行更改。 观察属性信号 在此示例中,我们创建了一个属性,该属性从SignalProducer中获取值。 我们还可以创建一个属性,该属性也可以从Signal中获取值。 可变属性 MutableProperty是一个可观察的容器,它像Property一样在更改时发出值,但是也可以直接对其进行突变。 与Property类似,它也符合PropertyProtocol 。 MutableProperty可以使用如下初始值进行初始化: 然后,我们可以如下更新其当前值: 就像Property一样,可以观察MutableProperty的signal和producer 。 当执行Bindings时, MutableProperty很有用。 然后MutableProperty允许我们编写如下代码: 在这里,这意味着mutableProperty的value由mutableProperty决定。 我们将在后续文章中讨论有关绑定的更多信息。 结论 希望本文能使您对Property和MutableProperty有所了解。 您可以在此处找到示例代码。 在下一篇文章中,我们将介绍Action ,它使您可以更好地控制和执行Signal的行为。

Swift 4中的属性观察器didSet和willSet

在本文中,我们将研究快速的属性观察器。 根据Apple的文档: 财产观察员观察并响应财产价值的变化。 每次设置属性值时都会调用属性观察器,即使新值与属性的当前值相同也是如此 。 让我们看一下下面的代码片段,以帮助我们更好地了解属性观察者willSet和didSet的工作方式。 从上面的屏幕截图可以看出,在设置person属性之前,将首先调用willSet中的代码。 在设置person属性后, didSet将立即被调用。 这就是为什么我们可以访问didSet中的person属性, 而这在willSet中是不可能的。 同样从代码中,您可以看到我在willSet观察器中使用了自定义参数名称。 您可以随意使用自己的自定义参数名称覆盖默认参数名称。 关于属性观察器的另一件事要注意的是:不能在惰性变量上使用属性观察器,因为只有在程序中调用了惰性变量后 , 惰性变量才能正确初始化并分配给内存。 示例如下所示: 惰性变量名称=“约翰” print(“我的名字是\(名字)”) 仅在上面的print语句中调用了变量名后,该变量名才会得到正确的初始化和分配的内存。 这违反了属性观察者的目的,因为具有观察者的属性需要具有初始值 。 每当属性值更改时,这将使它能够跟踪更改。 当您必须跟踪属性以确定值何时更改以执行某些逻辑时,就需要属性观察器 。 因此,您可以将其抽象为willSet和,而不是使用某些函数来检查属性的值以执行某些操作。 当值设置为所需值时,让它执行逻辑。 相信阅读完本文后,您现在对Swift中的属性观察器如何工作有了更好的了解。 感谢您的阅读,并随时在下面提出任何意见或问题,我将为他们解答。

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基础知识:制作简单的iOS应用程序所需的条件

随着手机数量的增加,对应用程序开发人员的需求逐年增加。 Swift是创建应用程序最常用的语言之一。 “ Swift是针对macOS,iOS,watchOS和tvOS的强大而直观的编程语言。 编写Swift代码是交互式且有趣的,语法简洁而又富有表现力,并且Swift包含开发人员喜欢的现代功能。 Swift代码在设计上是安全的,但也可以生成运行速度极快的软件” 现在一切都应该运行,您应该可以使用该应用了。 万一遇到任何错误,请在Stack Overflow上查找它们。 到应用的代码: 将立即更新 谢谢,希望您喜欢。

征服ReactiveSwift:信号和观察者(第3部分)

大家好! 欢迎来到征服ReactiveSwift的第3部分。 在上一篇文章中,我们讨论了ReactiveSwift的各种原语。 在这一部分中,我们将讨论Signal ,它是Source类别下的一个重要原语。 本文将指导您完成创建信号并通过Observer进行观察的过程 。 信号 在函数式无功编程(FRP)中,我们将系统建模为时变函数。 这只是意味着我们定义了系统随着时间的流逝如何运行。 与命令式编程相反,在命令式编程中,我们在给定的时间点管理系统状态,而在FRP中,这里我们处理一段时间内状态的变化。 Signal的概念很好地体现了这种“随时间变化”的概念。 信号定义为事件流,其中每个事件代表给定时间点的系统状态。 事件 ( 信号的基本单位)可以是以下类型之一: 值 :任何类型的有效信息 失败 :指示流已完成,并显示错误 已完成 :指示流的成功结束,将不再发出其他事件 中断 :表示事件产生已被中断 信号继续发送“ 值 ”类型的事件流,直到遇到“ 失败/完成/中断 ”类型的事件。 一旦信号发出类型为“ Error / Completed / Interrupted ”的事件,它将停止发送任何值。 观察者 为了观察信号发出的事件,ReactiveSwift提供了一个称为Observer的原语。 观察者是围绕(Event) -> Void类型的闭包的简单包装。 它封装了响应信号发出的事件的系统行为信息。 假设我们要观察一个发射整数值的信号 。 我们将定义一个观察者,如下所示: 让观察者= Signal .Observer {(event)in 切换事件{ 案例让.value(v): print(“ value = \(v)”) […]