Swift中有用的模糊基础类型
Foundation拥有大量的类,使iOS开发更容易,但我们只与其中的一些进行交互,比如Data
和URLSession
。由于这些类型与日常使用的东西相关,因此最终比其他类型更受欢迎。但其他的呢?
有一堆基金会类型是如此情境化,人们怀疑他们甚至存在于第一位。事实上,它们很少被提及作为问题的解决方案,人们最终会使代码模仿语言中已经存在的东西。但它们存在,尽管它们已经陈旧,但大多数这些类型仍然非常有用。让我们看看其中的一些。
NSScanner
NSScanner
可以逐步从基本字符串中提取数字和字符串,类似于scanf
在C中的工作方式:
public func extractIntsFrom(string: String) -> [Int] {
它有许多变体,例如scanString
,scanDouble
和scanHexInt
,并且可以配置为扫描字符串中的特定位置并考虑区分大小写。当您查找特定模式(如数字)而不是具体匹配时,这是搜索字符串出现的更直接的解决方案。
事实上它来自OBJ-C意味着它不是非常Swifty(通过使用指向虚拟对象的指针在这里给出),但是你可以将它包装在一个扩展中,以使它对最终用户更好。
NSCountedSet
计算机科学中存在许多问题,需要您跟踪某个元素的数量,例如经典的anagram面试问题:
func isAnagram(_ first: String, _ second: String) -> Bool {
使用带有Int
值的字典很容易解决这个问题,但我们不需要,因为这正是NSCountedSet
它的作用。
func isAnagram(_ first: String, _ second: String) -> Bool {
元素可以重复添加到集合中,并检查其计数。如果计数达到零,则从集合中删除元素。countedSet.add(element)``countedSet.count(element)
CFBinaryHeap
雨燕标准库有一个臭名昭著的缺乏数据结构的,但你可以找到在基金会树和堆实现在形状CFTree
和CFBinaryHeap
。堆是实现优先级队列结构的一种非常有效的方式,因为它们对代码非常广泛,CFBinaryHeap
可以节省您一些时间。
我正在将它添加到列表中,因为它模糊而且很酷,但我不得不说它很难使用。CFBinaryHeap
是一个C CoreFoundation类,它没有桥接到Foundation,所以如果不管理大量的指针,你将无法使用它。你最好的选择是编写或使用像MCBinaryHeap这样的包装器。
let array = [8,3,5,4,1]
优先级队列在图搜索问题中很流行,可用于将效率提高到需要跟踪无序数组中最小或最大元素的任何位置。
NSCache
NSCache
是一种类似于字典的集合类型,但它有两个重要的关键区别。首先,它不会复制放入其中的密钥对象,其次,它会自动从系统内存不足的条目中删除条目。
删除条目的实际策略是神秘的,但如果您有创建昂贵的对象,使用它NSCache
可以是常规字典缓存的非常系统友好的替代方法。以下是它如何用于缓存UIImages
:
final class ImageDownloader {
NSOrderedSet
当重复无关紧要时,集合非常适合跟踪元素,但由于集合访问权限为O(1),因此无法保证在执行此操作时将对它们进行排序。顾名思义,除了元素是有序的外,它的NSOrderedSet
作用类似于常规。Set
let set = NSMutableOrderedSet()
因为这是一个旧类型,你会注意到它没有泛型 - 所有操作都基于Any
类型。这不是很Swifty,所以你可能想把它包装成一个Swift类型:
class OrderedSet<T: Hashable>: Sequence {
NSByteCountFormatter
基金会里有大量不起眼的格式化程序,但我特别喜欢其中的一些。ByteCountFormatter
将字节计数格式化为人类可读的文件大小格式 如果您的应用程序下载内容,则无用,因为您不需要手动计算这些值。
let bytes = 1024 * 1024
NSDataDetector
NSDataDetector
类似于NSScanner
,它的不同之处在于它从电话号码,地址和链接等字符串中提取上下文数据。
let string = "I write for https://swiftrocks.com and my phone is 555-111-111."
缺点是它再次依赖于Foundation的正则表达式API,因为它已经过时了。这也不是很快,但NSDataDetector
如果你需要提取这些信息,它仍然是一个非常稳固的类型。
结论
了解它们可以帮助您防止编写不必要的代码。