Swift-經常使用數據類型

除了基礎語法,在 iOS 開發中,常常還會用到一些數據類型如日期,二進制數據等。算法

顏色

UIColor

UIKit 中使用的顏色。swift

  • 直接根據顏色的名字獲取。
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 中使用的顏色。markdown

  • 直接根據顏色的名字獲取。
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設備兼容時使用。
相關文章
相關標籤/搜索