Swift-常用数据类型

730 阅读5分钟

除了基础语法,在 iOS 开发中,经常还会用到一些数据类型如日期,二进制数据等。

颜色

UIColor

UIKit 中使用的颜色。

  • 直接根据颜色的名字获取。
UIColor.red
UIColor.green
UIColor.blue
  • 根据RGB数值计算。
// 参数的取值范围为0~1之间
UIColor(red: 100.0/255.0, green: 100.0/255.0, blue: 100.0/255.0, alpha: 1.0)

// iOS10推出
// 创建sRGB模式的色彩,与RGB相比,sRGB更加标准。
UIColor(displayP3Red: 100.0/255.0, green: 100.0/255.0, blue: 100.0/255.0, alpha: 1.0)
  • Assets.xcassets中创建Color Set,然后通过名字获取。
UIColor(named: "red")
UIColor(named: "green")
UIColor(named: "blue")
  • 获取系统元素和应用的颜色。
UIColor.systemRed
UIColor.systemGreen
UIColor.systemBlue
UIColor.link
UIColor.placeholderText
UIColor.systemBackground
UIColor.lightText

Color

SwiftUI 中使用的颜色。

  • 直接根据颜色的名字获取。
Color.red
Color.green
Color.blue
  • 根据RGB数值计算。
// sRGB
Color(.sRGB, red: 100.0/255.0, green: 100.0/255.0, blue: 100.0/255.0, opacity: 1.0)
// P3
Color(.displayP3, red: 100.0/255.0, green: 100.0/255.0, blue: 100.0/255.0, opacity: 1.0)
  • Assets.xcassets中创建Color Set,然后通过名字获取。
Color(named: "red")
Color(named: "green")
Color(named: "blue")
  • 通过UIColor获取。
Color(UIColor.systemRed)

日期

  • 日期: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 date = Date()
let formatter = DateFormatter()

// 方式一
formatter.locale = Locale(identifier: "zh-CN")
// 自动根据Locale调整输出格式,模版也只需要指明需要显示哪些元素,与顺序无关,如dMMM与dMMM一样
formatter.setLocalizedDateFormatFromTemplate("ydMMM")

// 方式二
formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "ydMMM", options: 0, locale:  Locale(identifier: "zh-CN"))

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())
  • 相对日期时间格式:RelateiveDateTimeFormatterWWDC 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设备兼容时使用。