除了基础语法,在 iOS 开发中,经常还会用到一些数据类型如日期,二进制数据等。
日期
- 日期:
Date
,包含年月日时分秒
,是一个结构体。
let date = Date()
print(date) // 输出:2019-08-01 02:27:14 0000
- 日期格式:
DateFormatter
,是一个类。从上面的代码可以看出,默认情况下的输出格式并不一定是我们需要的,这时候需要用DateFormatter
格式化日期的输出格式。
let date = Date()
// 构造格式化工具
let formatter = DateFormatter()
// 指定输出格式,可以自由制定,但是固定的是 yyyy:年 MM:月 dd:日 hh:时 mm:分 ss:秒
// 如果想要24小时制,hh改为HH
formatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
// format.dateFormat = "yyyy年-MM月-dd日"
// Date转String
let dateStr = formatter.string(from: date)
print(dateStr)
- 日期相对值
let formatter = DateFormatter()
// 默认英文,设置中文
formatter.locale = Locale(identifier: "zh-CN")
// 相对日期
formatter.doesRelativeDateFormatting = true
// dateStyle与timeStyle有五种样式
formatter.dateStyle = .medium
formatter.timeStyle = .short
let dateStr = formatter.string(from: Date())
print(dateStr) // 今天 下午8:00
- iOS 10 推出了一个新的日期格式化器
ISO8601DateFormatter
,该类可以很好地处理格式为yyyy-MM-ddTHH:mm:ssZZZZZ
的日期。
let formatter = ISO8601DateFormatter()
// String转Date
let date = formatter.date(from: "2020-01-01T12:00:00 08:00")
// Date转String
let dateStr = formatter.string(from: Date())
- 相对日期时间格式:
RelateiveDateTimeFormatter
,WWDC 2019 推出的一个新的日期格式化类,它可以方便的计算出两个时间的相对时间,并返回字符描述(支持多个语言)。
let formatter = RelativeDateTimeFormatter()
// 默认英文,设置中文
formatter.locale = Locale(identifier: "zh-CN")
// 默认显示风格 numeric
formatter.localizedString(from: DateComponents(year: -1)) // "1年前"
formatter.localizedString(from: DateComponents(month: -1)) // "1个月前"
formatter.localizedString(from: DateComponents(day: -1)) // "1天前"
formatter.localizedString(from: DateComponents(hour: 10)) // "10小时后"
formatter.localizedString(from: DateComponents(minute: 10)) // "10分钟后"
formatter.localizedString(from: DateComponents(second: -10)) // "10秒钟前"
// 设置显示风格 named
formatter.dateTimeStyle = .named
formatter.localizedString(from: DateComponents(year: -1)) // "去年"
formatter.localizedString(from: DateComponents(month: -1)) // "上个月"
formatter.localizedString(from: DateComponents(day: -1)) // "昨天"
formatter.localizedString(from: DateComponents(hour: 10)) // "10小时后"
formatter.localizedString(from: DateComponents(minute: 10)) // "10分钟后"
formatter.localizedString(from: DateComponents(second: -10)) // "10秒钟前"
日历
- 日历:
Calendar
,也是一个结构体,可以理解为一个工具结构体,它可以帮助我们处理很多开发中遇到的日期问题。
// 获取日历
let calendar = Calendar.current
- 拆分日期中的
年月日时分秒
var date = Date()
// 创建一个DateComponents
var components = DateComponents()
// 创建一个Calendar
let calendar = Calendar.current
// 拆分年月日时分秒与星期
calendar.component(.year, from: date)
calendar.component(.month, from: date)
calendar.component(.day, from: date)
calendar.component(.hour, from: date)
calendar.component(.minute, from: date)
calendar.component(.second, from: date)
calendar.component(.weekday, from: date)
- 由
年月日时分秒
构成日期
// 创建一个DateComponents
var components = DateComponents()
// 设置各个时间成分
components.year = 2019
components.month = 8
components.day = 1
components.hour = 12
components.minute = 0
components.second = 0
// 创建一个Calendar
let calendar = Calendar.current
// 构造日期
var date = calendar.date(from: components)
print(date!)
- 提供了很多好用的方法,如果有与日期操作有关的方法不妨去该类中找找,下面举出一些常见的方法。
let date = Date()
// 判断一个日期是否是今天
let isToday = Calendar.current.isDateInToday(date)
// 判断一个日期是否是昨天
let isYesterday = Calendar.current.isDateInToday(date)
// 判断一个日期是否是明天
let isTomorrow = Calendar.current.isDateInTomorrow(date)
// 判断一个日期是否是属于周末双休日
let isWeekend = Calendar.current.isDateInWeekend(date)
// 判断一个日期和另外一个是否相等
let isSameDay = Calendar.current.isDate(date, inSameDayAs: Date())
// 比较两个日期
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd"
let date1 = dateFormatter.date(from: "2020/1/1")
let date2 = dateFormatter.date(from: "2021/12/31")
let components: Set<Calendar.Component> = [.year, .month, .day]
let delta = NSCalendar.current.dateComponents(components, from: date1!, to: date2!)
let timeDifference = "(delta.year!)" "年" "(delta.month!)" "个月" "(delta.day!)" "天"
二进制数据
- 二进制是计算机的基本进制,存储在硬盘、内存包括网络传输的数据都是以二进制存在。在实际开发中,经常会碰到普通数据与二进制数据的互换。
- Swift 用
Data
表示二进制数据,同样也是一个结构体。 - 最常见的是与字符串互换
let originStr = "Hello Swift Data"
// String转Data
let data: Data = originStr.data(using: .utf8)!
// Data转String
let str = String(data: data, encoding: .utf8)
print(str)
- 从 Swift 5 开始,
Data
只用于表达连续的数据。Apple 引入了ContiguousBytes
协议来表示数据的连续。遵守这个协议表示该类型提供以连续的方式直接访问底层原始数据的能力。以后不需要担心有时内存占用会莫名变大的问题了。 - WWDC 2019 宣布
Data
支持压缩,但截至目前尚未提供基于Data
的API,但提供了基于NSData
的API,NSData
可以很容易地包装Data
。一共提供了四种压缩算法:- lzfse:推荐使用。
- lz4:压缩效率较低,但速度快。
- lzma:最有效的压缩,但如果压缩的数据量比较大的时候会消耗大量的内存,速度会很慢。
- zlib:与其他非Apple设备兼容时使用。
// 引入Compression模块
import Compression
let image = UIImage(named: "largeImage")
let imgFile: Data = image!.pngData()!
do {
let compressed1 = try NSData(data: imgFile).compressed(using: .lzfse)
let compressed2 = try NSData(data: imgFile).compressed(using: .lz4)
let compressed3 = try NSData(data: imgFile).compressed(using: .lzma)
let compressed4 = try NSData(data: imgFile).compressed(using: .zlib)
} catch {
print(error.localizedDescription)
}