Tag: swift

Swift 4中的多个ViewController(第2部分)

系列 Swift 4中的多个ViewController(第1部分) 如何在Swift 4 medium.com中使用Multiple ViewController Swift 4中的多个ViewController(第2部分) 如何在Swift 4 medium.com中使用Multiple ViewController Pada part 1 kita telah berhasil membuat多视图控制器。 Pada第2部分Ini Kita Akan Menguji Apakah视图控制器Kedua Berfungsi Semestinya Atau Tidak。 Mulai Pembuatan Projek Pada langkah pertama kita阿肯mendrag kembali按钮pada视图控制器pertama ke视图控制器kedua untuk membuat segue。 Setelah kita drag akan ada penghubung antara视图控制器pertama dengan yang kedua。 伊西坎·纳玛(Isikan nama)标识符 标识符boleh diisi […]

Swift中的哈希协议

昨天我进行了一次关于集合的讨论,并提出了符合可哈希协议的类型的想法。 不久之后,我意识到我对可哈希协议的理解是有限的,因此我开始将我确实知道的信息拼凑在一起。 我知道一个协议类似于一个蓝图,因为它列出了一个人必须采取并遵守的职责。 我还知道,集合在无序集合中存储了相同类型的不同值。 我的猜测是,当我们在集合中使用自定义类型时,它必须符合可哈希协议,这意味着要被视为可哈希对象,需要满足许多要求。 无论哪种方式,我都无法深入了解可哈希协议的实际含义或它们在自定义类型中的使用方式,因此我开始进行一些调查。 我浏览了Apple的文档,试图弄清楚什么是可哈希协议,并希望能更全面地了解为什么在集合中使用它们。 苹果将hashable定义为“一种为整数提供哈希值的类型。”好吧,但是什么是哈希值?-通过进一步阅读,我发现哈希值由类型的hashValue属性提供,并且基本上是一个整数,即对于相等比较的任何两个实例,都是相同的。 综上所述, hashValue是具有以整数形式存在的hashValue的类型,可以在不同类型之间进行比较。 举例来说,我们有两个实例a和b 。 如果a == b ,则a.hashValue == b.hashValue ,但是具有相同hashValue两个实例并不总是相等的。 当我们遵守可散列协议时,我们还必须遵守平等协议,但是让我们一次采取这一步骤。 我们遵循可哈希协议,就像我们执行其他任何协议一样: 狗类:可哈希{ var uid:整数 变量名称:字符串 变量年龄:整数 init(uid:Int,name:String,age:Int){ self.uid = uid self.name =名称 自我年龄=年龄 } } 但是,当我们遵循可hashValue协议时,我们必须具有hashValue属性。 狗类:可哈希{ var uid:整数 变量名称:字符串 变量年龄:整数 var hashValue:Int { 返回uid.hashValue } init(uid,Int,name:String,age:Int){ self.uid = uid self.name =名称 自我年龄=年龄 } } […]

Xcode 10(Swift 4.2)中的自定义圆形按钮

Xcode故事是设计iOS App外观的最佳方式之一,到目前为止,它仍有一些局限性。 今天,我将教您最简单的方法来实现圆形按钮,而无需导入任何精美的库。 让我们开始: 创建一个新的子类UIButton的 swift文件(我将命名为RoundButton.swift )。 2.在RoundButton.swift文件中粘贴此代码。 import UIKit @IBDesignable class RoundButton: UIButton { @IBInspectable var cornerRadius: CGFloat = 0{ didSet { self .layer.cornerRadius = cornerRadius } } @IBInspectable var borderWidth: CGFloat = 0{ didSet { self .layer.borderWidth = borderWidth } } @IBInspectable var borderColor: UIColor = UIColor .clear{ didSet { self .layer.borderColor = […]

您实际上从项目成就中学到了什么? (2/2)

在上一个故事中,我讨论了已解决的主要错误。 接下来,我将分享我自己开发的一些小功能。 我知道这些很简单,并且已经有很多库可用。 但是,这全都取决于您如何努力地自己做事。 使用默认的UISlider不能这么自定义。 因此,我制作了一个自定义类ProgressBar 。 在此,我添加了子视图(上面蓝色突出显示的一个)。 添加了@IBInspectable属性,以便我们可以直接从情节提要中以编程方式自定义。 所以我用自定义类SnackBar创建了一个新的UIView 。 拖延了titleLabel并添加了UIViewController的扩展名,以便我可以从任何视图控制器中调用。 但是我遇到的主要问题是如何在任何视图控制器中提示。 幸运的是,我从堆栈溢出得到了关于任何视图中的浮动对象的答案,即使用UIWindow和Apple已经在AppDelegate类中提供了窗口对象。 我拖动一个UIView并将UITableView作为子视图添加到我的ViewController中,将DropDownView分配为带有插座的自定义类。 @IBOutlet弱var dropDownView:DropDownView! 在底部添加了一个UIView作为高度限制为1的分隔符。上部包含一个标签,其中显示了选定的选项。 那就是带有标题和标记的Option表单元UI。 这对于所选选项将是可见的。 DropDownTableViewCell是上述选项单元格UI的自定义类。 DropDownCellModel是由选项类型( PerformanceDateGroup )和选定状态组成的单元格模型。 现在,根据要求,每天,每周和每月需要3个选项。 创建枚举PerformanceDateGroup选项案例。 上面的类是DropDownView,它由 1. OptionTableView的 委托和dataSources 。 2. setupGesture()已添加到选定标签。 点击它会调用toggleMenu()方法来显示/隐藏下拉菜单。 3. handleFilterSelection()装饰用户选择的那个单元格。 4.在选择选项时,它调用的是委托方法didSelect(…) ,该方法执行符合ViewController的操作。 用法: setupDropDown()将设置下拉单元模型并委托。 setupData()首次使用日期选项作为过滤器时第一次处理您的数据。 hideOnOtherView()处理用户是否在下拉菜单外点击。 如果下拉菜单可见,它将隐藏。 希望您喜欢这个故事,并希望自己开始发展。 👏👏👏 您的一项努力可以将事情变成另一个层次 🎉🎉🎉 待会儿👋👋👋!!!

Swift 5中的排他性实施

每次我们为变量设置值或从变量读取值或将参数传递给函数时,都会访问内存。 发布模式中排他性强制对Swift项目的影响 Swift 5中的排他性实施可能以两种方式影响现有项目: 如果项目源违反了Swift的排他性规则,并且Debug测试未能执行无效代码,则执行Release二进制文件可能会触发运行时陷阱。 崩溃将产生一条诊断消息,“ 对…的访问重叠,但修改需要排他访问 ”。 源代码级修复通常很简单。 内存访问检查的开销可能会影响Release二进制文件的性能。 在大多数情况下,影响应该很小。 结论 排他性强制仅捕获单线程错误。 对内存的独占访问可带来更可靠的性能,并显着优化: 图书馆 编译器 用户编写的代码 通过在发布版本中启用完全排他性强制实施,Swift 5有助于消除错误和安全性问题,确保二进制兼容性以及启用将来的优化和语言功能。 参考文献 https://swift.org/blog/swift-5-exclusivity/ https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md https://developer.apple.com/videos/play/wwdc2017/402/ 您可以通过Twitter,Linkedin,Facebook和Github与我们联系。

用私有的Objective-C成员创建Swift框架。 黄金三镖客

我最近正在开发一个封闭源代码Swift框架。 不幸的是,代码的某些部分位于Objective-C中(依赖于纯C库)。 在本文中,我重点介绍了使用混合Swift / ObjC代码的框架时的一些问题。 我展示了一些使ObjC代码内部化时尝试的方法。 使它对于框架用户不可见,但是仍然可以从Swift代码中访问,这让我感到非常头痛。 另外,我也分享了一个最终解决方案。 问题 关于Swift / ObjC互操作性的文章和教程很多,但是很少关注框架目标。 看来,即使您已准备好一切, 也仍然几乎不可能对框架用户有效地隐藏Objective-C部分 (至少只要您希望将其公开给Swift部分即可)。 假设您创建了一个名为MyFramework的框架, 其中包含以下成员: 好的,我的意思是“默认”的Swift ObjC互操作性。 简要回顾一下: 要将Swift暴露给Objective-C : 目标需要定义一个模块 将Swift成员标记为@objc 使Swift成员从NSObject继承 将Objective-C暴露给Swift : 将ObjC导入放置在桥接头文件中(如果可用) 将ObjC导入放置在伞状标题中(对于框架) 你可以在这里读更多关于它的内容: 苹果:将Swift导入Objective-C 苹果:将Objective-C导入Swift Jen Sipila关于Swift互操作性的文章 这种方法存在一个重大问题: “ Swift会 在您的伞形标题中 看到您公开 公开的 每个 标题。 该框架中的Objective-C文件的内容可以从该框架目标内的任何Swift文件中自动获得,而无需导入语句。” 因此,它没有提供所需的行为 。 此外,我注意到,这常常导致一连串的“包括非模块化标头”问题。 从字面上看,您可以重写一半的标头。 只要您不导入控件之外的任何标头,例如某些静态库中的标头,它仍然是可行的。 加起来: 优点: ObjC的预期方式-> Swift互操作性 缺点: 暴露给Swift的所有Objective-C成员也是公开可见的 导入非模块化标头的常见问题 […]

如何为您的iOS应用设置生物特征认证

多年来,安全一直是苹果的主要关注点,他们一直在倡导为iOS和整个Apple生态系统提供更好的安全性。 Touch ID于2013年从iPhone 5s开始引入,最近发布的iPhone X用Face ID代替了它,用户可以使用其面部来进行生物特征登录,而不是Touch ID。 Touch ID使用先进的电容式触摸来检测用户的指纹,因为Face ID使用iPhone X中的正面真实深度摄像头,并且在两种情况下,数据都被发送到Apple处理器内部的安全区域,该区域与其他系统隔离包括iOS。 没有数据存储在Apple服务器或任何iCloud服务器中。 苹果公司声称某人能够使用Face ID打开手机的可能性为1,000,000分之一(与您拥有相同指纹的概率为50,000,十分之一)。 如何在应用程序中添加Touch ID / Face ID 为了为用户提供更好的安全性和简化的登录,您可以在自己的应用程序中使用Touch ID / Face ID。 Apple提供了一个名为“ 本地身份验证”的框架,用于将生物识别登录集成到您的应用程序中。 在您的应用程序中导入本地身份验证框架,即可开始使用。 您需要做的第一件事是创建LAContext类的引用,如下所示。 LAContext具有一个名为biometryType的属性,可让您在Face ID和Touch ID之间进行选择。 让上下文= LAContext() 下一步是检查当前设备是否支持生物特征认证。 您可以使用LAContext类提供的以下功能。 它返回布尔值,指示是否支持生物特征认证。 context.canEvaluatePolicy(.deviceOwnerAuthentication,错误:无) 最后,您可以调用validatePolicy方法以使用Touch ID / Face ID实施实际的身份验证。 有关实现,请参考以下代码段。 在您的应用程序中使用生物识别身份验证时有一些注意事项,我将在下面进行解释。 在正常情况下,您将通过API将用户凭据发送到服务器来对用户进行身份验证,并在成功从服务器进行验证后,将对用户进行身份验证。 在这里,服务器实际上是使用存储在数据库中的凭据来验证API中传递的凭据。 对于生物特征认证,验证发生在设备级别。 本地身份验证框架提供的context.evaluatePolicy仅返回成功或错误,指示用户的指纹或面部是否已在设备上注册。 这里要注意的重要一点是,如果用户的设备中配置了其他人的指纹,则他/她将获得成功的身份验证。 您可以添加免责声明,以通知用户相同的内容。 查看PayPal iOS应用程序以供参考。 由于生物特征识别登录不提供识别用户的选项,因此我们需要针对该场景找到替代方案。 一种方法是将用户凭据存储在应用程序内部,并通过Touch ID或Face […]

Swift解决方案:Flyweight模式

Swift Solutions是涵盖设计模式的一系列文章。 在每篇文章中,我们讨论该模式是什么,何时应用以及如何以Swifty方式实现它。 飞量模式是一种节省内存的模式,当有许多要实例化的对象共享相似性时使用。 在本文中,我们将说明并编写Swift中的flyweight模式。 阅读本文之后,您将知道在必须创建大量相关对象时如何节省内存。 插图 首先,让我们使用文本编辑器的经典示例。 文本编辑器实例化并重复使用所有26个字母。 例如,当键入“ HELLO WORLD”时,我们将在三个不同的时间重新创建“ L”字符。 这很浪费,因为我们创建了三个字符对象来表示相同的字母。 flyweight模式的目标是共享可重用的对象,而不是不必要地复制它们,从而使我们的文本编辑器轻巧。 我们通过首先将对象分为两部分来重用对象:外部状态和内部状态。 外在的是指对象的根据上下文而改变的部分,因此无法共享。 例如,一个字符可能被加粗,着色或具有较大的字体大小。 这类数据不可重用,因为我们不希望给定字符的所有实例都共享这些属性。 另一方面,固有数据表示跨字符保持相同的内容。 固有数据的一个示例是给定字符的形状。 所有重复的字符都是渲染的形状,并且该形状不会从一次出现更改为下一次出现。 每当角色出现在我们的整个作品中时,我们都可以使用相同的“ L”形,然后对其应用外在属性。 总结一下: 内部数据是不可变的,相同的,没有上下文的,因此可以重用。 外在数据是可变的和上下文的,因此,并非在所有情况下都可以重用。 通过分离内部数据和外部数据,我们能够确定我们可以在对象中重用的内容。 考虑到这一点,让我们跳入代码示例。 实作 我们将在我们的代码中模拟一支装满步兵的军队。 我们还可以有弓箭手,将军和许多其他类型的士兵,并且我们想尽可能地重复使用,因为这些士兵实体中的每一个都会大量存在。 protocol Soldier { func render(from location: CGPoint, to newLocation: CGPoint) } 首先,我们创建一个Soldier协议,该协议具有将士兵在网格上的原始位置以及士兵将要移动到的新位置的功能。 我们代码的目标是随着战斗的进行在网格上绘制步兵部队。 由于每个士兵都有一个唯一的位置,因此位置被认为是外部状态。 Flyweight对象不会存储位置,但是它们仍需要通过其功能输入来处理外部数据。 不久之后会更多。 飞行重量 让我们看看Flyweight对象的外观: class Infantry: Soldier { private […]

BDD使用XCUITest的XCTActivity功能吗?

苹果公司最近宣布了XCUITest框架的新功能。 活动的一项重要功能就是可以将XCTest操作组织为人类可读的活动。 新协议XCTActivity已添加到XCTest框架。 注意:本文最初发布在我的个人博客上 什么是XCUITests中的活动 通常,UI Tests在执行过程中会执行许多操作,例如,点击按钮,滑动等。到目前为止,Xcode中的XCTest报告显示了测试报告中的所有操作,这些操作不是特别可读。 活动是通过提供有意义的名称将这些操作分组的方式,因此XCTest结果将在结果中使用该活动名称以使其更具可读性。 您可以在此处阅读有关Apple官方文档中活动的更多信息。 我们可以在任何动作上进行活动 什么是BDD BDD aka行为驱动开发是通过使用Gherkin或类似格式的可执行规范来开发应用程序的过程,以便程序员可以将这些规范用于开发,而业务人员可以将其用于需求规范或实时文档。 BDD是一种由内而外的开发方法。 您可以在此处了解有关BDD的更多信息 我们可以使用XCTActivity进行BDD吗? 让我们尝试回答这个问题。 想象一下,我们将创建一个Greeter应用程序,该应用程序在输入时会向用户致意。 所以我们的应用有两个要求 应用程序应具有输入按钮 当用户点击输入按钮时,它应该显示问候消息 让我们来编写这个的Gherkin功能文件: 功能:招呼用户 场景:用户应该看到问候语 给定的应用程序启动 当用户点击输入按钮时 那我看一下问候语 现在,我们以人类可读的格式编写了所有需求。 让我们深入研究代码。 在Xcode内创建一个名为Greeter的新单视图应用程序,并包括UI测试。 在我们的UI测试中,我们可以添加带有方案名称的测试和带有步骤名称的“活动”,如下所示 func testUserShouldSeeGreetingsMessage(){ XCTContext.runActivity(名称:“启动应用程序”) XCUIApplication()。launch() } XCTContext.runActivity(名称:“当用户点击输入按钮时”) XCUIApplication()。buttons [“ enter”]。tap() } XCTContext.runActivity(named:“然后我应该看到问候消息”){_ XCTAssertTrue(XCUIApplication()。staticTexts [“ Welcome”]。exists) } 当我们第一次运行测试时,它将失败,因为没有按钮或静态文本。 我们可以轻松实现按钮和静态。 使用辅助功能标识符“输入”将按钮添加到主故事板,并添加标签“ welcomeText”。 现在创建IBAction到按钮以在点击时显示“欢迎”文本。 我们的ViewController将如下所示: @IBOutlet弱var welcomeText:UILabel! @IBAction […]

如何在Xcode 8中使用已安装iOS 11 Beta的设备

我们正处于WWDC ’17星期,Apple昨天发布了iOS 11和Xcode 9的新测试版。 像我这样的许多好奇的开发人员都立即安装了iOS 11 now现在我们遇到了问题。 当您尝试从Xcode 8到我们安装了iOS 11 Beta的设备运行项目时,我们得到以下信息: 不要惊慌😅 这是分步解决方案: 1- [下载](https://developer.apple.com/download/)并安装支持此iOS版本的beta Xcode(目前为Xcode 9) 2-找到已安装的Xcode-Beta.app文件,然后右键单击图标,然后单击“显示软件包内容” 3-转到目录>开发人员>平台> iPhoneOS.platform> DeviceSupport 您应该在此文件夹中看到Beta平台。 (现在是11.0) 4-以与步骤2相同的方式,找到要用于beta设备的Xcode版本。 (现在是Xcode 8) 右键单击Xco​​de.app图标,然后单击“显示包内容” 转到目录>开发人员>平台> iPhoneOS.platform> DeviceSupport 5-将11.0拖放到“设备支持”文件夹中。 现在重新启动您的Xcode,恭喜👏 您可以按运行并查看您的应用程序在Beta设备上运行👻