除了基础语法,在 iOS 开发中,常常还会用到一些数据类型如日期,二进制数据等。算法
UIKit 中使用的颜色。swift
UIColor.red
UIColor.green
UIColor.blue
复制代码
// 参数的取值范围为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
复制代码
SwiftUI 中使用的颜色。markdown
Color.red
Color.green
Color.blue
复制代码
// 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")
复制代码
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
复制代码
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!)" + "天"
复制代码
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)
复制代码
Data
只用于表达连续的数据。Apple 引入了ContiguousBytes
协议来表示数据的连续。遵照这个协议表示该类型提供以连续的方式直接访问底层原始数据的能力。之后不须要担忧有时内存占用会莫名变大的问题了。Data
支持压缩,但截至目前还没有提供基于Data
的API,但提供了基于NSData
的API,NSData
能够很容易地包装Data
。一共提供了四种压缩算法: