在Swift中从头开始创建哈希表 理论 哈希表是一个强大的数据结构,大多数开发人员每天都在有意或无意地使用它们。 在Swift字典中是哈希表。 我们应该了解它们是如何工作的,以便我们可以最好地使用它们。 在本文中,我将介绍如何在Swift中制作哈希表的简化版本。 我建议,如果您想了解哈希表的内部工作原理,请遵循并与我一起做一个! 什么是哈希表,我为什么要关心? 哈希表是一种使用键存储和检索值的数据结构。 例如,我可以有一个名称和年龄的哈希表: myHashTable.set(值:30,forKey:“ Manny”) myHashTable.getValue(forKey:“ Manny”)//应该返回30 哈希表的特别之处在于,在正常情况下,我们可以使用键来获取值,而无需遍历数组。 如果我们有一个键值对数组,则必须在整个数组中搜索以找到特定的键值。 这通常称为O(n)访问时间,这意味着获取值的时间基于元素的数量(n)是线性的。 由于哈希表的强大功能,我们可以近似地将值取回O(1)(恒定时间),这使得哈希表非常适合存储我们要基于唯一键快速检索的数据。 重要的是要注意,哈希表不能保持顺序,并且不如用于遍历元素的数组好。 那么,这是什么O(1)法术? 假设您将衣服堆成一堆。 每天早晨,您将不得不在堆里过筛以寻找当天的服装。 现在想象一下,您拥有的所有衣物都有一个抽屉,而这些物品总是放在同一抽屉中。 您将能够非常快速地检索每件衣服! 过于简单的解释是,使用魔术哈希函数,我们的密钥被映射为整数。 该整数将对应于数组中的索引。 这个概念可能看起来像这样: 那么魔术散列函数会是什么样子? 也许为了生成字符串“ Manny”的哈希值,我们可以获得每个字符的整数表示并将它们加在一起。 因此,“ Manny”的哈希值可能等于515。您可能会意识到,由于交换属性“ Manny”将具有与“ Mynan”相同的哈希值。 进行字符串哈希处理有很多更好的方法,但最终它们都只是将字符串转换为整数。 请注意,键不必是字符串,它们可以是任何具有哈希函数的对象。 在理想情况下,每个键都将具有唯一的哈希值,但实际上这是不可行的。 仅根据字符串大小,可能会有数十亿个排列。 如果我们的字母表中只有小写字母,则五个字符的字符串的排列将为26⁵! 想一想,如果您的每件衣服都在自己的独特抽屉中,那么您将需要多少个抽屉。 那么,如何将所有可能的键唯一地映射到数组索引? 我们不! 碰撞和单独链接 哈希函数的目标是将所有可能的键均匀分布到整数范围内。 通过一点数学,我们可以减少这些整数,以便将它们包含在数组大小内。 这将不可避免地导致我们的某些键解析为相同的索引,但不要担心,有几种方法可以处理冲突。 什么是最好的解决方案,让您只用几个抽屉就能穿衣服? 如果您回答将成组的衣服放到抽屉里,那么您是正确的。 如果您只是大堆衣服,那么您的早晨一定很O(n)。 在这篇文章中,我选择使用称为“单独链接”的碰撞解决方案。 通过单独的链接,我们仍将使用键的哈希值来获取数组中的索引。 但是,这次我们将在该索引处有一系列键值对。 这使我们可以将可解析为相同索引的键值对放在可搜索链中。 为了简单起见,我们将使用数组来实现这些链(通常使用链表)。 这是“单独链接”的样子: […]
难度等级:容易 在本教程中,您将学习如何通过长按手势来制作可移动的表格视图单元格。 您可以在我的github页面上找到相同的教程。 bhaveshtandel17 / MovableTableViewCell MovableTableViewCell –在本教程中,您将学习如何通过长按手势来移动表格视图单元格。 github.com 怎么做? 添加UILongGestureRecognizer 处理UIGestureRecognizerState.began 处理UIGestureRecognizerState.changed 让我们开始吧!! 🎉
我将medium.com视为一种将代码保存在远程位置的介质,以便可以从任何地方访问它。 这可能对别人没有帮助。 🙂 对于Swift 3+和Alamofire 4.4 ,我创建了一个名为Connectivity Swift类。 您可以使用Alamofire NetworkReachabilityManager类,并根据需要configure isConnectedToInternet()方法。 我只是在检查设备是否已连接到互联网。 import Foundation import Alamofire class Connectivity { class func isConnectedToInternet() ->Bool { return NetworkReachabilityManager()!.isReachable } } 用法: if Connectivity.isConnectedToInternet() { print(“Yes! internet is available.”) // do some tasks.. } 编辑:由于swift鼓励计算的属性,您可以更改上述函数,如: import Foundation import Alamofire class Connectivity { class var isConnectedToInternet:Bool { return NetworkReachabilityManager()!.isReachable […]
如果您是一名应用程序开发人员,那么在处理多个应用程序中必须使用的多种颜色代码时,您肯定会面临一些挑战。 如果我们要为某个UIView设置颜色,那么我们将通过属性检查器在情节提要上进行设置,或者通过编程对UIColor类使用以下方法之一: 初始化(白色:CGFloat,alpha:CGFloat) 初始化(色相:CGFloat,饱和度:CGFloat,亮度:CGFloat,alpha:CGFloat) 初始(红色:CGFloat,绿色:CGFloat,蓝色:CGFloat,alpha:CGFloat) 初始化(CGColor cgColor:CGColor!) init(patternImage图片:UIImage) 初始化(CIColor ciColor:CIColor) 这似乎很无聊,而我们必须通过提供适当的值来进行设置,例如: self.view.backgroundColor = UIColor(red: 120/255, green: 150/255, blue: 200/255, alpha: 1) 苹果已经从Xcode 9中引入了一种称为“ 颜色集”的东西。 颜色集可帮助您在一处定义所有颜色。 您可以轻松地将自定义颜色添加为颜色集。 有趣的事实是您可以为每种颜色指定适当的命名约定。 当您要更改颜色值时,它也会很有用,您可以在一处更改颜色,并且可以在任何地方反映。 作为开发人员,您可以轻松记住该颜色的名称,也可以参考并在其他项目中使用它。 这使我们的生活轻松吗? 让我们逐步了解如何实现此目标: 您需要在资产文件中添加“ 新颜色集” 。 给您的颜色设置适当的命名约定 : 选择颜色集并通过属性检查器分配所需的颜色 。 通过创建颜色集添加所有必需的自定义颜色。 现在是时候在我们的应用程序中使用此自定义颜色了。 首先,我们将看到如何通过情节提要为UIView设置颜色。 您也可以通过编程方式使用自定义颜色。 检查这个…… 好的,这些是在iOS中正确使用颜色的一些技巧。 希望下次我会提出其他一些功能。 同时,如果您对iOS中的Reactive编程感兴趣,则可能希望查看有关此内容的文章: Swift第1部分中的Reactive编程 随时在Linkedin上添加我,祝您编程愉快……..
Merhaba👋🏻, 第1部分:API API应用程序API。 亲子ilişkilerineve流利的query’lerinegeçmedenönceuygulamaya 用户 ve 风格 ekleyelim。 用户ve类别控制器的用户类别控制器的声音。 蒸气xcode -y 用户sınıfını实现edelim。 Fluent’in用户手册。 Bu id’yi Song eklerken creatorID参数设置。 creatorID’miz ile Song’u ekledik。 响应身体içerisindeayrıntılıolarakgörüyoruz。 Bir Song daha ekleyelim。 即时用户(Sim’User’ıneklediğitümSong’ları)正在获取其他信息。 Buradakullanacağımızurlyapısı; http:// localhost:8080 / api / users / CREATOR_ID /歌曲 Son olarak Song’u ekleyen用户’ıgetiren fonksiyonumuzu测试edelim。 Kullanacağımız路线yapısı; http:// localhost:8080 / api / songs / 1 / creator 亲子ilişkilerindebahsetmem […]
UITabBarControllers是在视图控制器之间导航的好方法。 iOS Clock应用程序就是一个很好的例子。 在线上有很多教程,介绍如何使用界面生成器来设置UITabBarControllers,但是最好也知道如何从头开始构建它。 实际上很简单! TabBarController 苹果给出了惊人的描述。 您可以使用标签栏控制器将您的应用组织为一种或多种不同的操作模式。 标签栏控制器的视图层次结构是自包含的。 它由选项卡栏控制器直接管理的视图和由您提供的内容视图控制器管理的视图组成。 每个内容视图控制器管理一个不同的视图层次结构,选项卡栏控制器协调视图层次结构之间的导航 因此,让我们开始吧! 我们将对UITabBarController进行子类化,以便轻松识别谁在管理选项卡。 因此,在Xcode中,继续创建一个名为TabBarController的新Swift类。 附带说明,请确保在启动用于编程视图控制器的Xcode应用程序时更新AppDelegate和info.plist。 使用NSLayoutAnchor删除情节提要 界面生成器是Apple提供的出色工具。 但是,了解… medium.com 的程序化方面也很重要 查看控制器 本质上,我们所需要做的就是创建视图控制器的实例,并将其分配给viewControllers属性。 因此,让我们首先创建将连接到tabBarController的视图控制器。 继续并创建DownloadsViewController,BookmarksViewController和收藏夹视图控制器。 在每个视图控制器中,更新viewDidLoad以更新视图的backgroundColor和title。 下面的示例适用于DownloadsViewController,但是BookmarksViewController和favoriteViewController应该分别具有标题Bookmarks和收藏夹。 view.backgroundColor = UIColor.whiteColor() self.title =“下载” 在TabBarController的viewDidLoad中,添加以下内容 让downloadViewController = DownloadsViewController() downloadViewController.tabBarItem = UITabBarItem(tabBarSystemItem:.Downloads,标签:0) 让bookmarkViewController = BookmarksViewController() bookmarkViewController.tabBarItem = UITabBarItem(tabBarSystemItem:.Bookmarks,标签:1) 让收藏夹视图控制器=收藏夹视图控制器() favoriteViewControllers.tabBarItem = UITabBarItem(tabBarSystemItem:.Favorites,标签:2) 让viewControllerList = [downloadViewController,bookmarkViewController,favoriteViewControllers] viewControllers = viewControllerList 注意,我们正在设置每个viewController的tabBarItem。 […]
戴夫·托马斯(Dave Thomas)的数据修补Kata的快速解决方案,第1部分 我正在Swift中解决Dave Thomas的代码问题,并将分享我的思考过程和解决方案。 以下是我对“数据整理” kata [项目回购]的第1部分的解决方案。 挑战在于分析一个混乱的,真实世界的数据集。 在weather.dat中,您将找到2002年6月在新泽西州莫里斯敦的每日天气数据。下载此文本文件,然后编写程序以输出温度分布最小(最大温度为第二列)的天数(第1列)。 ,最小的第三列)。 为了摆脱不需要的列,removeUnneededColumns()在每行上循环并仅保留前三个单元格。 该方法可以正常工作,但是很丑陋,需要改进(有什么建议吗?)。 注意,并非我们的所有数据点都是“干净的”,有些包含垃圾信息,例如“ *”。 为了在cleanData()中解决此问题,我们创建了一组无效字符并将其删除。 让invalidCharachters = NSCharacterSet(charactersInString:“ 0123456789。”)。invertedSet 要注意的另一件事(我在此kata之前就很模糊)是,当您在Swift中嵌套了高阶函数时,就无法使用简写语法(例如array.map {$ 0 * 2}),您需要列出参数并使用“ in”关键字 气象记录评估员 现在,我们已经加载了数据,对其进行了整理,对其进行了清理,并将其转换为WeatherRecords数组,我们需要找到温度变化最小的日期。 由于WeatherRecord结构具有计算的属性temperatureDelta: var temperatureDelta:Double { 返回maximumDailyTemperature — minimumDailyTemperature } 我们需要做的就是遍历记录并找到增量最小的记录。 minElement()方法将执行此操作(请注意,由于我们不使用嵌套闭包,因此我们将返回使用更简洁的$ 0,$ 1语法)。 执行者 现在,我们拥有解决此kata所需的所有组件,我们只需要将它们放在一起并获得正确的答案。 我们将使用一个Executor结构来执行此操作,该结构使用先前方法的输出来调用每个方法并返回答案。 execute()的单元测试还充当集成测试,用于验证一切是否按预期进行。 我将在本系列的其他kata后面编写我的解决方案和思考过程。 请让我知道什么有用,什么没用。 另外,我很想听听您关于如何改进代码任何部分的想法。
老实说 第一次在iPad上启动Swift Playgrounds时,我回到了我的四年级老师Mead夫人第一次给我看电脑的时候。 当然,“学习代码”教程比使用徽标要酷得多。 而且,Byte比我年轻时的乌龟还酷,而且更具表现力,但是感觉是一样的。 这种兴奋是我很多次都没有感受到的,iPhone的引入是一个明显的例外。 Playgrounds Books示例很酷,我期待孩子们学习使用此工具进行编码。 不过,那只是冰山一角。 例如,这是Playgrounds支持的部分框架列表: AVKit 帐目 音频单元 加速 音频工具箱 AVFoundation 核心文字 CF网络 核心图片 CoreGraphics 核心数据 核心音频 核心运动 核心位置 核心蓝牙 达尔文 调度 外部配件 GLKit 游戏套件 游戏控制器 图像IO 金属套件 金属性能着色器 媒体播放器 MobileCoreServices 多点连接 OpenGLES 相片 摄影套件 石英核心 快速浏览 重播套件 社会的 SpriteKit Safari服务 WebKit Swift Playgrounds是为孩子而设计的…… Swift Playgrounds也适合我。
在5到10年内,Swift将成为每个人用来编写软件以与其IoT Toaster API交互以及如何与有意识的移动机器人竞赛进行通信的语言。 建立您的Swift技能为这个光明的未来做准备将很有用。 Paul Hudson是Swift教程的Doctor Doctor Who。 他必须在家中有某种Tardis,以便一次又一次地返回以产生他投放的内容的数量。 [在此处插入声波螺丝起子和迷人的英国参考资料] 从保罗·哈德森本人手中。 本课程是为期一天的密集课程,旨在帮助您快速开始开发应用程序:即使您以前从未使用过Swift,也将从头开始构建真正的应用程序。 是的,您将学到大量的Swift,但是您还将学到Xcode,UIKit,调试等等。 前进。 我会等。 迅捷:英雄零 您现在知道了Swift。 但是您要求更多。 您想学习如何构建出色的iOS应用程序。 我们为什么不从一些高级话题开始。 让我们看看在不同平台上可能发生的事情,然后从那里开始,让您的想象力飞涨。 让我们从小处开始。 38mm小。 尽管很小,但Apple Watch并不是一个易于构建的界面。 克里斯蒂娜·泰(Kristina Thai)将其提炼成一段精彩的谈话,您可以在午餐时间观看。 这包括手表可访问性,动画数据和文件传输(手表连接性),最佳电池性能和听写功能。 我还将研究并发症的最佳用途(手表主屏幕上的小部件),以及如何使用ClockKit框架来更好地满足开发人员的需求。 如何构建引人注目的手表应用程序/功能 好。 现在更大。 这个要深入一点,但让我们避开细节,而专注于iOS之类平台的可能。 阿萨夫·吉尔伯(Assaf Gelber)将您拖到导航兔子洞中,以便您可以清楚地了解实际应用程序如何处理从A-> B中获取用户的问题。 准备深入探讨栈,标签,segue和条形按钮项的海洋,因为此演讲的全部内容是探索如何构建合适且可维护的体系结构以在应用程序内导航。 导航的侵入式调查 更大! 同样,上下文是我们追求的目标。 您不必学习SpriteKit,但是通过Craig Clayton的本课程学习将使您对可能的想法有所了解。 在本研讨会期间,我们将努力为Apple TV制作一个名为SoccerPong的游戏(经典Pong游戏中的扭曲)。 无论您是否有使用Swift的经验,本研讨会都将帮助您启动第一个应用程序。 雪碧套件和Apple TV 您已经凝视着大海,露出正在发展的冰山。 你从这里去哪里? 这里有一些想法: 建立东西! 打开Xcode,单击“创建新的XCode项目”,选择“单视图应用程序”,然后开始拖动内容。 要么… 下一步:中级/高级快速。
最近,我一直在研究一个简单的任务管理器应用程序。 我决定快点编写它,因为我不想使用任何Pod,所以我从心爱的Realm切换到了CoreData,这就是我们旅程的起点。 CoreData与Swift 3一起对我来说还很陌生,因此我想阅读文档,但仍在Swift 2.2中。 那里没有问题,StackOverflow肯定会救我! 好吧,事实并非如此简单。 我花了几个小时才能找到所有资源并使其正常工作。 因此,我现在正在编写本教程,以便您可以在一个地方找到我发现的遍布互联网的内容。 将CoreData添加到您的Xcode项目 答:简单的解决方案是在创建Xcode项目时仅选择CoreData。 Xcode将为您的AppDelegate文件添加所有必需的代码,还将为您创建.xcdatamodeld文件。 从这里跳到项目符号点2。 B.将CoreData添加到现有项目 这不是那么简单,但仍然很容易做到。 第一件事是打开您的AppDelegate文件,并在顶部导入CoreData 。 下一步是添加CoreData方法,如下所示: // MARK:-核心数据栈 懒惰的varpersistentContainer:NSPersistentContainer = { / * 应用程序的持久性容器。 这个实现 创建并返回一个容器,并已为 应用到它。 该属性是可选的,因为有合法的 可能导致存储创建失败的错误条件。 * / let container = NSPersistentContainer(name:“ tets”) container.loadPersistentStores(completionHandler:{(storeDescription,error)在 如果让error = error as NSError? { //用代码替换此实现,以正确处理错误。 // fatalError()使应用程序生成崩溃日志并终止。 尽管此功能在开发过程中可能很有用,但您不应在运输应用程序中使用此功能。 / * 出现错误的典型原因包括: *父目录不存在,无法创建或不允许写入。 *由于设备锁定时的权限或数据保护,无法访问持久性存储。 *设备空间不足。 […]