difference
函数用于任意元素实现 Equaltable 、且有序集合。数组
下面是该函数的示例代码:微信
let bird = "bird"
let bear = "bear"
// step1
let diff = bird.difference(from: bear) //两个字符串不一样的部分: i d e a
// step2
let newBird = bear.applying(diff) // bird
复制代码
step1 经过 difference
函数得到了 bird 和 bear 不一样的部分 diff,step2 经过调用 applying
函数将 diff 应用到 bear 上来获得 newBird。markdown
由于 difference
函数能够应用于任意有序集合,因此也能够在数组中使用:app
let arr1 = [1, 2, 3]
let arr2 = [2, 3, 4]
let diff = arr1.difference(from: arr2) // 两个数组不一样的部分:[1, 4]
let newArr1 = arr2.applying(diff)
print(newArr1) // [1, 2, 3]
复制代码
由于 difference
函数返回的结果自己也是一个集合,因此咱们也能够使用 for-in 来迭代它的元素:ide
for change in diff {
switch change {
case .remove(let offset, let element, _):
print("offset = \(offset), element = \(element)") // offset = 2, element = 4
case .insert(let offset, let element, _):
print("offset = \(offset), element = \(element)") // offset = 0, element = 1
}
}
复制代码
在 Swift 5.1,官方提供了数据压缩函数,但该函数仅限于 NSData 使用。函数
示例代码:测试
let str = "Swift"
let data = str.data(using: .utf8)
if let d = data {
let d1 = d as NSData
let res = try d1.compressed(using: .lzfse)
print(res)
}
复制代码
CompressionAlgorithm 为枚举,提供四种 case:lz四、lzfse、lzma、zlib。优化
UnitDuration 新增如下类型:spa
UnitFrequency 新增 framesPerSecond,可用来测试 FPS。code
UnitInformationStorage 新增如下类型:
新增 RelativeDateTimeFormatter 用来计算两个日期之间的间隔,支持本地化。这个更新很实用,能够很方便的计算各类相似于微信聊天的时间标签。
let oldDateStr = "2021-01-05"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let oldDate = dateFormatter.date(from: oldDateStr)!
let nowDate = Date()
let formatter = RelativeDateTimeFormatter()
formatter.locale = Locale(identifier: "zh_CN")
let dateString = formatter.localizedString(for: oldDate, relativeTo: nowDate)
print(dateString) // 1周前
复制代码
用于本地化显示数组转成的字符串:
let str = ["🤣", "🐖", "🦄"]
let formatter = ListFormatter()
formatter.locale = Locale(identifier: "zh_CN")
let zhString = formatter.string(for: str)
print(zhString) // "🤣、🐖和🦄"
formatter.locale = Locale(identifier: "en_US")
let enString = formatter.string(for: str)
print(enString) // "🤣, 🐖, and 🦄"
复制代码
经过 itemFormatter 来设置 item 的格式。
func stringToDate(str: String) -> Date? {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
return dateFormatter.date(from:str)
}
let dateStr = ["2020-01-09", "2020-02-05", "2020-04-21"]
let dates = dateStr.compactMap { stringToDate(str: $0) }
let listFormatter = ListFormatter()
let dateFromatter = DateFormatter()
dateFromatter.dateFormat = "yyyy-MM-dd"
listFormatter.itemFormatter = dateFromatter
let str = listFormatter.string(for: dates) // "2020-01-09, 2020-02-05, and 2020-04-21"
// 经过设置 locale 来进行本地化输出
listFormatter.itemFormatter = dateFromatter
listFormatter.locale = Locale(identifier: "es_ES")
let str = listFormatter.string(for: dates) // "2020-01-09, 2020-02-05 y 2020-04-21"
复制代码
新增 addBarrierBlock
。当全部 task 执行完以后,才会执行 addBarrierBlock
的 task。
let queue = OperationQueue()
queue.addOperation {
print("task1")
}
queue.addOperation {
print("task2")
}
queue.addOperation {
print("task3")
}
queue.addOperation {
print("task4")
}
queue.addBarrierBlock {
print("complete")
}
// task1 task2 task3 task4 complete
复制代码
经过设置 totalUnitCount 来进行进度检测:
queue.progress.totalUnitCount = 3
复制代码
优化了 Scanner 的使用方式。
let scanner = Scanner(string: "")
// Swift 4
var nameNSString: NSString?
if scanner.scanUpToCharacters(from: .newlines, into: &nameNSString) {
let name = nameNSString! as String
}
// Swift 5.1
let nameString = scanner.scanUpToCharacters(from: .newlines)
复制代码