Tag: swift

iOS:设置基本的语音处理I / O音频单元-Swift

如果您是需要使用Apple的AudioToolbox和AudioToolbox API的不幸者之一,请让我尝试让您的生活更轻松一些。 苹果公司缺乏文档和有效的示例,因此使用Crucis确实可以使用这些工具进行开发。 经过反复试验,我设法弄清楚了如何在Swift中设置Voice Processing I/O音频单元。 该代码还可以用于设置任何其他音频单元,您只需要根据位于不良文档中的常量替换组件类型,子类型和所有其他参数的值即可。 无需赘言,这里是代码。 在该示例中,我还将展示如何设置本机的某些属性,例如“ Automatic Gain Control和“ Bypass Voice Processing 。

ARC Swift中内存管理的第一种方法-第1部分

ARC代表自动引用计数,它是Objective-C和Swift的Clang编译器的功能,可以为我们管理内存。 每次创建类实例时,ARC都会分配一块内存,该空间将存储与该实例相关的所有信息。 一旦您的代码不使用它,ARC就会取消分配该类实例,因为应用程序不再需要它。 ARC仅适用于引用类型 ,不适用于值类型,如Swift中的“ 结构”或“ 枚举” 。 因为我想向您展示如何使用对象图管理内存,所以我在Xcode中创建了一个简单的视图项目,而不是Playground文件。 下面的示例显示ARC如何处理内存: 如上所示,为类实例分配的内存仍然存在。 即使将nil分配给’reference1’和’reference2’,分配的内存也不会释放。 这是因为还有另一个引用指向以前创建的实例,因此ARC在需要之前不会释放此内存。 您可以在下面的示例中看到: 尽管ARC通常可以成功地为应用程序管理内存,但是在某些情况下,我们需要提供额外的信息。 定义代码各部分之间的关​​系将有助于我们避免诸如强引用保留周期或内存泄漏之类的问题。 在前面的示例中,跟踪ARC如何为我们管理内存确实很容易,但是当我们开始编写复杂的代码时,这将变得更加困难。 因此,在向ARC提供信息时我们需要小心。 在编程时,我们最常犯的错误是有两个指向彼此的不同引用。 由于它们都是在内存中分配并使用的,因此ARC将永远不会释放内存,因为这种环境会导致强大的参考周期。 即使将“ nil”分配给这些实例,仍将分配内存。 在下一个示例中,我们将创建一个保留周期,并观察如何处理内存。 可以看到,没有调用’deinit’函数,这是因为类实例仍然存在。 提示:只需查看内存检查器中的紫色警告图标,即可轻松检测保留周期和内存泄漏 为了解决此问题,我们可以为参考提供额外的信息,以便ARC在管理内存时将其考虑在内。 在这种情况下,我们将把“ B”类到“ A”类的“ a”引用设置为“弱”以避免这种问题。 ARC是一项强大的功能,可帮助我们避免iOS上的内存处理。 但是,在某些情况下,我们需要特别注意。 将两个引用相互指向会导致强烈的引用周期,这不是预期的行为,因此我们需要通过提供一些额外的信息来避免此问题。 下一部分见,我们将通过一些示例了解这些关系之间的差异以及如何正确使用“ 弱 ”和“ 无主 ”。

通过快速使用代码生成来快速创建模型

大家好! 今天,我们将学习如何停止编写样板代码。 创建某些模型时,我们总是会编写相同的代码。 假设我们有一个地方,那里有ID,名称和位置。 所以我们的结构看起来像这样: 然后,当您“构建”项目时,sourcery将为所有模板生成代码。 您可以在此处找到其他安装方法:https://github.com/krzysztofzablocki/Sourcery#installation 配置文件 让我们在xcode项目中创建名称为“ Templates”的新文件夹,我们的模型应该在名称为“ Models”的文件夹中。 现在我们需要在项目文件夹中创建“ .sourcery.yml”文件。 并写成这样: 您必须用项目名称(文件夹名称)替换“ ProjectName”,这是从“ .sourcery.yml”文件到我们的模型文件夹和模板的路径。 在此处阅读有关此配置文件的更多信息。 代码生成 因此,现在所有人都可以生成代码了。 我们只需要创建一个模板。 让我们创建一个简单的“ JSONAutoRepresentable”协议: 在我们最近创建的Templates文件夹中,创建文件“ JSONRepresentable.stencil” 好的,现在我们需要编写模板。 我们该怎么办? 我们必须遍历实现协议的所有类: 2.我们的模型可以包含一些变量,这些变量不是来自服务器的。 在这种情况下,我们可以为此变量添加注释:“ // sourcery:skip”,然后我们必须遍历所有没有跳过注释的变量: 3.在某些情况下,我们可以使用不同的变量名称和json键。 在这种情况下,我们可以使用“ // sourcery:jsonKey =” JSONKey””标记该变量。 然后: 4.如果变量是Array,那么我们需要映射到elementsTypes(并且需要将驼峰大小写转换为蛇形大小写。): 5.如果该变量也是JSONAutoRepresenteable: 6.如果变量是枚举: 7.对于所有其他变量: 完整的JSONRepresentable.stencil文件可在以下位置找到: https://gist.github.com/Banck/0aa2d992173f972999772cda768929f5 因此,现在我们可以将JSONAutoRepresentable协议添加到我们的Place模型并构建项目。 结果如下: 这是带有跳过注释和jsonKey的模型的示例: 您可以在此处阅读有关模板的更多信息: https://cdn.rawgit.com/krzysztofzablocki/Sourcery/master/docs/writing-templates.html 希望本文对您有所帮助。 ✌️

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中使用TapGestures

Swift的上一个主要更新的一部分已经发布了许多重大改进。 Swift越来越大,我认为它所采取的方向确实很有希望。 另一方面,确实某些苹果API尚不希望人们利用Swift的所有这些新功能来获得最理想的接口。 如果您在tvOS项目中工作,那么您将不得不经常使用其中之一,那就是UITapGesturesRecognizer,这是为Siri Remote创建自定义手势的一种非常常见的方式。 更具体地说,我说的是为他们设置允许的触摸和按动类型的方式。 让手势= UITapGestureRecognizer(目标:自我,行动​​:#选择器(触发)) 手势.allowedPressTypes = [NSNumber(值:UIPressType.menu.rawValue)] 手势.allowedTouchTypes = [NSNumber(value:UITouchType.indirect.rawValue)] view.addGestureRecognizer(手势) 之前的代码是用Swift 3编写的,但是您可以在下面的内容中找到最近几年的发展: // Objective-C: 手势.allowedPressTypes = @ [@ UIPressTypeMenu]; gesture.allowedTouchTypes = @ [@ UITouchTypeIndirect]; // Swift 2: pose.allowedPressTypes = [UIPressType.Menu.rawValue] pose.allowedTouchTypes = [UITouchType.Indirect.rawValue] // Swift 3: gesture.allowedPressTypes = [NSNumber(值:UIPressType.menu.rawValue)] gesture.allowedTouchTypes = [NSNumber(值:UITouchType.indirect.rawValue)] 如您所见,每次迭代都使此代码变得越来越难读,从而增加了从NSNumber的演变继承而来的冗余冗长性。 几天前,由于我们正在将Zattoo迁移到Swift 3,我与同事Chris Goldsby先生谈到了这个问题。 而且…他给了我一个好主意。 实际上,获得像克里斯先生所希望的那样清晰易读的界面并不难。 毕竟,这两个属性只是NSNumbers的数组。 创建它们应该不难吗? […]

向量资产优于位图资产的3个原因

在Zeplin中,您可以选择将资产下载为位图或矢量。 我一直选择位图资源,因为那是其他教程使用的资源。 但是,显然矢量资产是优越的。 这篇文章很好地解释了为什么会这样。 我说“显然”是因为我听说iPhone不能像Android手机那样真正地扩展矢量资产。 这就是我当时比我更明智的消息。Android手机确实确实使用矢量资产中的算法来生成所需大小的图像。 考虑到Android设备和屏幕尺寸的广泛性,这才有意义。 但是,iPhone中的矢量资产实际上并未随算法扩展。 因此,通过在位图上使用矢量不会获得更高质量的图像。 相反,您获得的质量与位图相同。 iPhone仅获取“矢量”资产并将其转换为相同的三个位图大小。 尽管如此,还是有一些 在iPhone上使用矢量资产的好处。 减少人为错误的可能性。 现在有三种位图大小(1x,2x,3x)。 这意味着您需要将三个图像上传到资产。 这是不小心拖放错误图像的三个机会。 使用矢量素材资源(在Xcode中通用)时,您只需要上传一张图片,而不是三张。 上传错误尺寸或图像的机会较小。 速度。 与#1相同。 如果您在应用程序中使用了大量图像,则使用矢量资产将需要上载的图像数量减少三分之一。 将来的证明。 iPhone当前仅使用三种图像尺寸(1x,2x,3x)。 这与屏幕的视网膜质量提高有关。 苹果几年前推出高视网膜屏幕时,每点的像素数量增加了,以获得更清晰的图像。 类似的技术增长似乎极有可能继续发生。 将来,我们可能需要上传4x,5x和6x图像。 如果我们使用矢量资产,该应用程序将为我们缩放图像。 这样可以避免我们丢弃位图资产的新大小。 尽管我不得不承认我对此感到有些困惑,但鉴于iPhone向量资产似乎并未真正在算法上起作用。 因此,我不确定它们将如何自动缩放为更大的尺寸。 但是我的明智导师解释了这一点,我相信他! 最终,使用矢量资产似乎没有任何弊端,只有上行优势。

使用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 3和Realm构建一个运动追踪iOS应用

有很多应用程序可以做到这一点。 我知道。 但是最近我搜索了一个特定的跟踪应用程序来监视需要某些特定数据的水上活动,但我找不到。 那么,当您找不到任何东西时该怎么办? 您只是构建自己的应用程序,对不对? 让我们使用Swift 3.1创建一个iOS锻炼跟踪应用程序,并使用Realm记录我们的锻炼情况。 创建一个新项目 与模板“单视图应用程序” 在继续之前,让我们在项目中进行几个配置 ,以接受从“ 用户位置”接收数据。 (如果您忘记设置此项,您的应用将崩溃) 转到Info.plist文件并设置两个“隐私”位置键。 您可以根据需要更改此键的值: 启用两个功能:后台模式->位置更新和Healthkit 然后转到Main Storyboard,单击第一个View Controller并嵌入到Navigation View Controller中 。 如果需要,您不需要使用导航控制器。 但这就是我在此示例中选择的。 行? 建立一个基本的UI 该 Tracking App 的第一个屏幕将是所有锻炼的列表,以使您有动力继续锻炼并保持更好的锻炼状态,为此,请使用TableView (不要忘记将所有约束标记为View的零) 。 在此视图的“ 导航项”中添加“ 条形按钮项” ,然后将“ 系统项”更改为“添加到元素的属性”检查器中。 对于“ 跟踪屏幕” ,再向“ 主情节提要”中添加一个“ 视图控制器” ,并通过按住Command键并拖动到该视图的“条形按钮”为其创建Segue。 在此视图中,我们需要添加有关当前锻炼的一些基本信息,例如: 距离 持续时间 步伐 随意选择最佳布局。 您将需要3x标签 (距离,持续时间和速度), 1x按钮 (开始/停止锻炼) 和一个MKMapView用于显示跟踪线。 在以优雅的布局显示所有这些元素之后,为所有元素创建IBOutlet并为按钮添加IBAction 。 […]

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 […]

Xcode Advanced Tips Part 2/2

Xcode技巧的第一部分Xcode高级技巧的第1部分/第2部分介绍了最常用的键盘快捷键。 幸运的Xcode具有更多隐藏的细菌。 今天,我们将继续寻找一些鲜为人知的技巧。 Alt + Command +向左箭头=折叠.m文件中的所有方法 当我们要调试或查看大型类文件时。 alt + command +←将所有类方法折叠到.m文件中。 快速查看所有可用的公共和私有方法定义的便捷方法。 使用alt +命令+→展开它。 2. Swift接口在哪里(.h文件): Swift没有像Objective c这样的.h文件。 alt + command +←(左箭头)对于查看所有方法定义仍然有用。 要查看变量/方法的详细范围,请转到魔术菜单->生成的接口,这将生成类似于.h文件的快速接口文件。 生成的文件: 3. Control + Command + J移至文本定义。 4.使用断点观察属性更改 5.界面生成器 Alt + Command + =更新框架 筛选+命令+ =更新约束 快捷键仪器长按开始按钮。 调试规:调试规监视您正在运行的应用程序。 调试指标会随着您的应用程序运行而不断变化-它们以直方图的形式显示,时间从左到右依次排列。 直方图中的尖峰表示活动。 6. 下载更多工具和软件.dmg / .xip文件 在XCode中,转到Xcode菜单→打开开发人员工具→然后选择更多开发人员工具…选项。 Safari将重定向到浏览器中下载所有软件链接。 7.奖金: 1. Xcode文档: 2. // […]